android camera2分析记录篇之二
【1】检测设备是否有无摄像机功能
if(!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)){
//do somethigs
}【2】
高通平台副摄可见
做过双摄项目的一般都知道, 副摄(一般id为2)对上层App是不可见的, 但我们在开发过程用需要对副摄进行一些测试, 因此是需要能打开副摄的,高通平台隐藏副摄是在Framework层做的处理,
camera API2 代码:
frameworks/base/core/java/android/hardware/camera2/CameraManager.java代码如下:
private ArrayList<String> getOrCreateDeviceIdListLocked() throws CameraAccessException {
// 部分代码省略
try {
numCameras = cameraService.getNumberOfCameras(CAMERA_TYPE_ALL);
/* Force to expose only two cameras
* if the package name does not falls in this bucket
*/
boolean exposeAuxCamera = false;
String packageName = ActivityThread.currentOpPackageName();
String packageList = SystemProperties.get("camera.aux.packagelist");
if (packageList.length() > 0) {
TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(',');
splitter.setString(packageList);
for (String str : splitter) {
if (packageName.equals(str)) {
exposeAuxCamera = true;
break;
}
}
}
if (exposeAuxCamera == false && (numCameras > 2)) {
numCameras = 2;
}//部分代码省略可以看到,这段代码逻辑是如果App包名在camera.aux.packagelist这个属性中,则可以打开副摄, 否则不行.因此打开副摄有两种方法:
设置camera.aux.packagelist这个属性, 把要打开的App包名添加进去
删除这部分限制Camera个数的代码(不推荐)
【3】adb 查看camera 详细信息 :adb shell dumpsys media.camera
C:\Users\androidos>adb shell
ingot:/ # dumpsys media.camera
== Service global info: ==
Number of camera devices: 2
Number of normal camera devices: 2
Number of public camera devices visible to API1: 2
Device 0 maps to "0"
Device 1 maps to "1"
Active Camera Clients:
[
(Camera ID: 0, Cost: 33, PID: 11179, Score: 0, State: 2User Id: 0, Client Package Name: org.codeaurora.snapcam, Conflicting Client Devices: {})
]
Allowed user IDs: 0
== Camera service events log (most recent at top): ==
03-27 13:59:55 : CONNECT device 0 client for package org.co【4】adb 设置camera相关命令:
1. adb shell dumpsys media.camera:查看camera的状态信息。
2. adb shell dumpsys media.camera --set-parameters:设置camera的参数。
3. adb shell dumpsys media.camera --set-parameters=flash-mode:on:设置camera的闪光灯模式为开启。
4. adb shell dumpsys media.camera --set-parameters=zoom:2:设置camera的缩放比例为2。
5. adb shell dumpsys media.camera --set-parameters=focus-mode:auto:设置camera的对焦模式为自动。
6. adb shell dumpsys media.camera --set-parameters=white-balance:auto:设置camera的白平衡模式为自动。
7. adb shell dumpsys media.camera --set-parameters=exposure-compensation:0:设置camera的曝光补偿为0。
8. adb shell dumpsys media.camera --set-parameters=scene-mode:auto:设置camera的场景模式为自动。
9. adb shell dumpsys media.camera --set-parameters=color-effect:none:设置camera的色彩效果为无。
10. adb shell dumpsys media.camera --set-parameters=antibanding:auto:设置camera的抗闪烁模式为自动。
Camera2 基本架构:
在API架构方面, Camera2和之前的Camera有很大区别, APP和底层Camera之前可以想象成用管道方式连接, 如下图:

如上图所示, Camera APP 通过CameraCaptureSession发送CaptureRequest, CameraDevices收到请求后返回对应数据到对应的Surface,
预览数据一般都是到TextureView, 拍照数据则在ImageReader中, 整体来说就是一个请求--响应过程, 请求完成后, 可以在回调中查询到相应的请求参数和CameraDevice当前状态,
总的来说, Camera2中预览/拍照/录像数据统一由Surface来接收, CaptureRequest代表请求控制的Camera参数, CameraMetadata(CaptureResult)
则表示当前返回帧中Camera使用的参数以及当前状态.
.... 大家可去原著链接中阅读此文,谢谢
链接:https://www.jianshu.com/p/23e8789fbc10







评论