本讲是Android Camera Native Framework专题的第19讲,我们介绍ICameraService.aidl详解。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
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调用 |