本讲是Android Camera Native Framework专题的第28讲,我们介绍Camera Native FW的获取CameraCharacteristic流程详解。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
getCameraCharacteristics总体流程
- Cameraserver进程刚起来做enumerate时会将CameraCharacteristics存放在CameraProviderManager的DeviceInfo3里面
-
上层问CameraService要CameraCharacteristics时,CameraService就从DeviceInfo3对象中直接获取,不会调用到HAL去
CameraProvider初始化CameraCharacteristics流程
- cameraserver进程启动时会从HAL层获取到当前平台支持多少颗Camera,针对每一颗Camera会去获取CameraCharacteristics,保存在mCameraCharacteristics
-
如果是Logical MultiCamera,会针对每一颗Physical Camera调用HAL层的getPhysicalCameraCharacteristics,保存在mPhysicalCameraCharacteristics Map中
- 在enumerateProviders会调用CameraProviderManager的filterSmallJpegSizes剔除小于1080P的Jpeg Size,剔除前会保留CameraCharacteristics到mCameraCharNoPCOverride
CameraService的getCameraCharacteristics逻辑
- 根据SystemCameraKind判断是否要拒绝访问
-
不拒绝,则通过Target SDK获取到overrideForPerfClass,传递给CameraProviderManager获取CameraCharacteristics
-
最后判断是否有Camera权限,如果没有则删除需要权限才能获取的静态Metadata(这里可以优化下,将无权限的静态Metadata缓存起来,不用每次都去操作Metadata)
需要权限的静态Metadata Tag
shouldRejectSystemCameraConnection逻辑
SystemCameraKind | 描述 |
---|---|
PUBLIC | 对所有应用程序和系统组件都是可见 |
SYSTEM_ONLY_CAMERA | 只对拥有android.permission.SYSTEM_CAMERA权限的进程可见,不会暴露给第三方应用程序 |
HIDDEN_SECURE_CAMERA | 只对HAL应用可见(通过hwbinder线程连接) |
- 如果是cameraserver自己调用该API,则不拒绝
-
如果是systemClient(uid<10000),则不拒绝
-
如果systemCameraKind是PUBLIC,则不拒绝
-
否则
-
HIDDEN_SECURE_CAMERA,拒绝
-
SYSTEM_ONLY_CAMERA,是否有SYSTEM_CAMERA权限,如果有则不拒绝,无则拒绝
CameraProviderManager的getCameraCharacteristics逻辑
-
如果是Hidden physical camera,则从mPhysicalCameraCharacteristics里面获取
-
否则,判断是否要为PerfClass做Override。如果要做,则返回mCameraCharacteristics,否则返回mCameraCharNoPCOverride