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
评论