frameworks/base/core/java/android/app/SystemServiceRegistry.java
registerService(Context.CAMERA_SERVICE, CameraManager.class, new CachedServiceFetcher<CameraManager>() { @Override public CameraManager createService(ContextImpl ctx) { return new CameraManager(ctx); }});
注册了系统服务CAMERA_SERVICE:实现了camera API2
camera API2 -> camera service -> camera-provider->hw_module(CAMERA_HARDWARE_MODULE_ID)->---
camera的初始化包括两部分:camera-provide初始化和camera service初始化
camera-provider的初始化获得了camera numbers和camera info等。
设备状态的改变使怎样通知到framework层的
struct CameraProvider : public ICameraProvider, public camera_module_callbacks_t {
}
/**
* Callback functions for the camera HAL module to use to inform the framework
* of changes to the camera subsystem.
void (*camera_device_status_change)(const struct camera_module_callbacks*,
int camera_id,
int new_status);
void (*torch_mode_status_change)(const struct camera_module_callbacks*,
const char* camera_id,int new_status);
*/
CameraProvider::CameraProvider() : camera_module_callbacks_t({sCameraDeviceStatusChange, sTorchModeStatusChange}) { mInitFailed = initialize(); }设置了两个在固定的函数sCameraDeviceStatusChange/ sTorchModeStatusChange
把hal层固定的函数设置到底层,当camera改变时调用这里设置的固定函数。
mModule->setCallbacks(this);
void CameraProvider::sCameraDeviceStatusChange( const struct camera_module_callbacks* callbacks, int camera_id, int new_status) {/×强制类型转换:根据继承关系得到CameraProvide的指针×/ CameraProvider* cp = const_cast<CameraProvider*>( static_cast<const CameraProvider*>(callbacks)); char cameraId[kMaxCameraIdLen]; snprintf(cameraId, sizeof(cameraId), "%d", camera_id); std::string cameraIdStr(cameraId); cp->mCameraStatusMap[cameraIdStr] = (camera_device_status_t) new_status; if (cp->mCallbacks != nullptr) { CameraDeviceStatus status = (CameraDeviceStatus) new_status; for (auto const& deviceNamePair : cp->mCameraDeviceNames) { if (cameraIdStr.compare(deviceNamePair.first) == 0) { cp->mCallbacks->cameraDeviceStatusChange( deviceNamePair.second, status); } } } }
CameraProvider的调用依赖mCallbacks变量,它是怎样赋值的?
// Methods from ::android::hardware::camera::provider::V2_4::ICameraProvider follow. Return<Status> CameraProvider::setCallback(const sp<ICameraProviderCallback>& callback) { Mutex::Autolock _l(mCbLock); mCallbacks = callback; return Status::OK; }
mCallbacks的赋值是通过binder接口ICameraProvider的setCallback。
看先mCallbacks是怎样赋值的?也就是setCallback是怎样被调用的。
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
CameraProviderManager::ProviderInfo::initialize()-> mInterface -> setCallback ( this );就把camera service 层实现的device/torch status change传递到camera HAL层
camera service层的cameraDeviceStatusChange的实现又调用了framework层注册的listener:
cameraDeviceStatusChange-> listener->onDeviceStatusChanged
camera service的初始化:获得底层服务camera-provider并获得底层camera信息
status_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) {
/*获得访问HIDL的binder接口*/
sp<provider::V2_4::ICameraProvider> interface;
interface = mServiceProxy->getService(newProvider);
sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, interface, this);
status_t res = providerInfo->initialize();
mProviders.push_back(providerInfo);
return OK;
}
赋值mInterface 通过mInterface访问hidl层代码
CameraProviderManager::ProviderInfo::ProviderInfo(
const std::string &providerName,
sp<provider::V2_4::ICameraProvider>& interface,
CameraProviderManager *manager) :
mProviderName(providerName),
mInterface(interface),
mProviderTagid(generateVendorTagId(providerName)),
mUniqueDeviceCount(0),
mManager(manager) {
(void) mManager;
}
如上面mInterface->setCallback(this);