第19讲 ICameraService.aidl详解 - Android Camera Native Fram

2024年11月02日 第19讲 ICameraService aidl详解 极客笔记

本讲是Android Camera Native Framework专题的第19讲,我们介绍ICameraService.aidl详解。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera 星球ID: 17296815
Wechat 极客笔记圈

ICameraService类图

ICameraService.aidl产生的Java或C++代码,相关类图如下所示:

调用端获取ICameraService对象

Java端获取ICameraService.Stub.Proxy对象

IBinder cameraServiceBinder = ServiceManager.getService("media.camera");
ICameraService cameraService = ICameraService.Stub.asInterface(cameraServiceBinder);

C++端获取BpCameraService对象:

sp binder = sm->getService(String16("media.camera"));
mCameraService = interface_cast(binder);

其中(详细流程请参考视频讲解):

  • Interface_cast会返回BpCameraService的实例,
  • 从ServiceManager获取到的binder是BnCameraService的实例。

相关代码: /frameworks/native/include/binder/IInterface.h

ICameraService.aidl接口详解

Function Description
int getNumberOfCameras(int type); 获取当前平台支持多少颗Camera
CameraInfo getCameraInfo(int cameraId); 获取某颗Camera的基本信息(facing和orientation),API2不使用该API
ICamera connect(ICameraClient client, int cameraId, String opPackageName, int clientUid, int clientPid, int targetSdkVersion); Open某颗Camera,获取到ICamera 实例,API2不使用该API
ICameraDeviceUser connectDevice(ICameraDeviceCallbacks callbacks, String cameraId, String opPackageName, @nullable String featureId, int clientUid, int oomScoreOffset, int targetSdkVersion); Open某颗Camera,获取到ICameraDeviceUser实例
CameraStatus[] addListener(ICameraServiceListener listener); 注册Listener,监听CameraService状态变化
ConcurrentCameraIdCombination[] getConcurrentCameraIds(); 获取可以并发访问的Camera ID组合
boolean isConcurrentSessionConfigurationSupported( in CameraIdAndSessionConfiguration[] sessions, int targetSdkVersion); 判断给定的并发SessionConfiguration是否支持
void removeListener(ICameraServiceListener listener); 删除Listener,取消监听CameraService状态变化
CameraMetadataNative getCameraCharacteristics(String cameraId, int targetSdkVersion); 获取指定Camera的静态CameraMetadata
VendorTagDescriptor getCameraVendorTagDescriptor(); 获取VendorTagDescriptor,在CameraMetadataNative解析Vendor Tag时需要用到
VendorTagDescriptorCache getCameraVendorTagCache(); 获取VendorTagDescriptorCache,其中存放不同VendorID的VendorTagDescriptor,在CameraMetadataNative解析Vendor Tag时需要用到
String getLegacyParameters(int cameraId); Android不支持HAL1之后,该API不会被调用了
boolean supportsCameraApi(String cameraId, int apiVersion); 判断当前平台是否支持HAL3
boolean isHiddenPhysicalCamera(String cameraId); 判断指定的Camera是否是隐藏的Physical Camera,针对隐藏的Physical Camera,CamcorderProfile可能不可用,因此使用Stream configuration map来获取最大录像size(MandatoryStreamCombination)。
ICameraInjectionSession injectCamera(String packageName, String internalCamId, String externalCamId, in ICameraInjectionCallback CameraInjectionCallback); 注入外部Camera来取代内部Camera,同一颗Camera ID可以在Internal或External Camera间切换。
void setTorchMode(String cameraId, boolean enabled, IBinder clientBinder); 控制手电筒模式的ON/OFF
void turnOnTorchWithStrengthLevel(String cameraId, int strengthLevel, IBinder clientBinder); 调整手电筒的强度
int getTorchStrengthLevel(String cameraId); 获取当前手电筒模式的强度。
oneway void notifySystemEvent(int eventId, in int[] args); 向CameraService通知一些系统事件(多用户切换、USB设备插拔事件),CameraServiceProxy调用
oneway void notifyDisplayConfigurationChange(); 向CameraService通知Display窗口配置发生变化,CameraServiceProxy调用
oneway void notifyDeviceStateChange(long newState); 向CameraService通知设备状态发生变化(如发生折叠,前镜头/后镜头被挡住),CameraServiceProxy调用

本文链接:http://so.lmcjl.com/news/16847/

展开阅读全文