frameworks/base/libs/ui/中的Camera.cpp文件用於實現Camera.h提供的接口,其中一個重要的片斷以下所示:java
const sp<ICameraService>& Camera::getCameraService() { Mutex::Autolock _l(mLock); if (mCameraService.get() == 0) { sp<IServiceManager> sm = defaultServiceManager(); sp<IBinder> binder; do { binder = sm->getService(String16("media.camera")); if (binder != 0) break; LOGW("CameraService not published, waiting..."); usleep(500000); // 0.5 s } while(true); if (mDeathNotifier == NULL) { mDeathNotifier = new DeathNotifier(); } binder->linkToDeath(mDeathNotifier); mCameraService = interface_cast<ICameraService>(binder); } LOGE_IF(mCameraService==0, "no CameraService!?"); return mCameraService; }其中最重要的一點是binder = sm->getService(String16("media.camera"));;這個調用用來獲得一個名稱爲"media.camera" 的服務,這個調用返回值的類型爲IBinder,根據實現將其轉換成類型ICameraService使用。
一個函數 connect的實現 以下所示:函數
sp<Camera> Camera::connect() { sp<Camera> c = new Camera(); const sp<ICameraService>& cs = getCameraService(); if (cs != 0) { c->mCamera = cs->connect(c); } if (c->mCamera != 0) { c->mCamera->asBinder()->linkToDeath(c); c->mStatus = NO_ERROR; } return c; }connect經過調用getCameraService獲得一個 ICameraService,再經過 ICameraService的cs->connect(c)獲得一個 ICamera類型的指針。 調用connect將獲得一個 Camera的指針,正常狀況下Camera的成員 mCamera已經初始化完成。
一個具體的函數startPreview 以下所示:ui
status_t Camera::startPreview() { return mCamera->startPreview(); }這些操做能夠直接對 mCamera來進行,它是ICamera類型的指針。
libmedia。so中的其餘一些文件與頭文件的名稱相同,它們是:spa
frameworks/base/libs/ui/ICameraClient.cpp frameworks/base/libs/ui/ICamera.cpp frameworks/base/libs/ui/ICameraService.cpp在此處,BnCameraClient和BnCameraService類雖然實現了onTransact()函數,可是因爲還有純虛函數沒有實現,所以這個類都是不能實例化的。
CameraService和CameraService::Client兩個類的結果以下所示:指針
class CameraService : public BnCameraService { class Client : public BnCamera {}; wp<Client> mClient; }
在CameraService中的一個靜態函數instantiate()用於初始化一個Camera服務,寒暑以下所示:code
void CameraService::instantiate() { defaultServiceManager()->addService( String16("media.camera"), new CameraService()); }事實上,CameraService:instantiate()這個函數註冊了一個名稱爲"media。camera"的服務,這個服務和Camera。cpp中調用的名稱相對應。
而這些Camera功能的具體實現,就是CameraService::Client所實現的了,其構造函數以下所示:繼承
CameraService::Client::Client(const sp<CameraService>& cameraService, const sp<ICameraClient>& cameraClient) : mCameraService(cameraService), mCameraClient(cameraClient), mHardware(0) { mHardware = openCameraHardware(); mHasFrameCallback = false; }構造函數中,調用openCameraHardware()獲得一個CameraHardwareInterface類型的指針,並做爲其成員mHardware。之後對實際的Camera的操做都經過對這個指針進行。這是一個簡單的直接調用關係。
CameraHardwareStub類的結構以下所示:接口
class CameraHardwareStub : public CameraHardwareInterface { class PreviewThread : public Thread { }; };