本讲是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调用 |