完整讲解了android中camera的工作机制,代码分析。对了解整个android工作流程会有很大的帮助。
if(mDeathNotifier==NULL){
mDeathNotifier=newDeathNotifier();
}
binder->linkToDeath(mDeathNotifier);
mCameraService=interface_cast<ICameraService>(binder);
}
LOGE_IF(mCameraService==0,"noCameraService!?");returnmCameraService;
}
其中最重要的一点是binder=sm->getService(String16("media.camera"));;这个调用用来得到
一个名称为"media.camera"的服务,这个调用返回值的类型为IBinder,根据实现将其转换成类型ICameraService使用。
一个函数connect的实现如下所示:
sp<Camera>Camera::connect(){
sp<Camera>c=newCamera();
constsp<ICameraService>&cs=getCameraService();if(cs!=0){
c->mCamera=cs->connect(c);
}
if(c->mCamera!=0){
c->mCamera->asBinder()->linkToDeath(c);c->mStatus=NO_ERROR;
}returnc;
}
connect通过调用getCameraService得到一个ICameraService,再通过ICameraService的
cs->connect(c)得到一个ICamera类型的指针。调用connect将得到一个Camera的指针,正常情况下Camera的成员mCamera已经初始化完成。
一个具体的函数startPreview如下所示:
status_tCamera::startPreview(){
returnmCamera->startPreview();
}
这些操作可以直接对mCamera来进行,它是ICamera类型的指针。其他一些函数的实现也与setDataSource类似。
libmedia.so中的其他一些文件与头文件的名称相同,它们是:
frameworks/base/libs/ui/ICameraClient.cppframeworks/base/libs/ui/ICamera.cppframeworks/base/libs/ui/ICameraService.cpp
在此处,BnCameraClient和BnCameraService类虽然实现了onTransact()函数,但是由于还有纯
虚函数没有实现,因此这个类都是不能实例化的。
ICameraClient.cpp中的BnCameraClient在别的地方也没有实现;而ICameraService.cpp中的
BnCameraService类在别的地方被继承并实现,继承者实现了Camera服务的具体功能。