android camera2分析记录篇之二

sancaiodm Android应用 2023-07-30 582 0

【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之前可以想象成用管道方式连接, 如下图:

38487b61-571f-4b9e-908f-acd99d69f4f1.png

如上图所示, Camera APP 通过CameraCaptureSession发送CaptureRequest, CameraDevices收到请求后返回对应数据到对应的Surface,

预览数据一般都是到TextureView, 拍照数据则在ImageReader中, 整体来说就是一个请求--响应过程, 请求完成后, 可以在回调中查询到相应的请求参数和CameraDevice当前状态, 

总的来说, Camera2中预览/拍照/录像数据统一由Surface来接收, CaptureRequest代表请求控制的Camera参数, CameraMetadata(CaptureResult)

则表示当前返回帧中Camera使用的参数以及当前状态.

....  大家可去原著链接中阅读此文,谢谢

链接:https://www.jianshu.com/p/23e8789fbc10




评论