Android camera open 流程( 二 )


//base/core/java////impl/.java
方法主要是将获取到的远端设备保存起来
283/**284* Set remote device, which triggers initial onOpened/onUnconfigured callbacks285*286* This function may post onDisconnected and throw CAMERA_DISCONNECTED if remoteDevice dies287* during setup.
288*289*/290public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException {291synchronized(mInterfaceLock) {292// TODO: Move from decorator to direct binder-mediated exceptions293// If setRemoteFailure already called, do nothing294if (mInError) return;//通过 ICameraDeviceUserWrapper 给远端设备实例加上一层封装296mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice);297298IBinder remoteDeviceBinder = remoteDevice.asBinder();299// For legacy camera device, remoteDevice is in the same process, and300// asBinder returns NULL.301if (remoteDeviceBinder != null) {302try {303remoteDeviceBinder.linkToDeath(this, /*flag*/ 0);304} catch (RemoteException e) {305CameraDeviceImpl.this.mDeviceExecutor.execute(mCallOnDisconnected);306307throw new CameraAccessException(CameraAccessException.CAMERA_DISCONNECTED,308"The camera device has encountered a serious error");309}310}//需要注意这个时间节点,此处触发 onOpened 与 onUnconfigured 这两个回调//mCallOnOpened是CameraDeviceImpl类的一个成员变量312mDeviceExecutor.execute(mCallOnOpened);313mDeviceExecutor.execute(mCallOnUnconfigured);314}315}

通过机制,我们远端调用了.方法,这个方法实现在类中 。
//av////.cpp
调用的方法才真正实现了连接逻辑
1577Status CameraService::connectDevice(1578const sp& cameraCb,1579const String16& cameraId,1580const String16& clientPackageName,1581const std::unique_ptr& clientFeatureId,1582int clientUid,1583/*out*/1584sp* device) {15851586ATRACE_CALL();1587Status ret = Status::ok();1588String8 id = String8(cameraId);1589sp client = nullptr;1590String16 clientPackageNameAdj = clientPackageName;15911592if (getCurrentServingCall() == BinderCallType::HWBINDER) {1593std::string vendorClient =1594StringPrintf("vendor.client.pid<%d>", CameraThreadState::getCallingPid());1595clientPackageNameAdj = String16(vendorClient.c_str());1596}//调用的 connectHelper 方法才真正实现了连接逻辑,//设定的模板类型是 ICameraDeviceCallbacks 以及 CameraDeviceClient 。1597ret = connectHelper(cameraCb, id,1598/*api1CameraId*/-1,1599CAMERA_HAL_API_VERSION_UNSPECIFIED, clientPackageNameAdj, clientFeatureId,1600clientUid, USE_CALLING_PID, API_2, /*shimUpdateOnly*/ false, /*out*/client);16011602if(!ret.isOk()) {1603logRejected(id, CameraThreadState::getCallingPid(), String8(clientPackageNameAdj),1604ret.toString8());1605return ret;1606}//注意 client 指向的类型是 CameraDeviceClient,其实例则是最终的返回结果1608*device = client;1609return ret;1610}
调用生成实例,
template1613Status CameraService::connectHelper(const sp& cameraCb, const String8& cameraId,1614int api1CameraId, int halVersion, const String16& clientPackageName,1615const std::unique_ptr& clientFeatureId, int clientUid, int clientPid,1616apiLevel effectiveApiLevel, bool shimUpdateOnly,1617/*out*/sp& device) {1618binder::Status ret = binder::Status::ok();16191620String8 clientName8(clientPackageName);16211622int originalClientPid = 0;16231624ALOGI("CameraService::connect call (PID %d \"%s\", camera ID %s) for HAL version %s and "1625"Camera API version %d", clientPid, clientName8.string(), cameraId.string(),1626(halVersion == -1) ? "default" : std::to_string(halVersion).c_str(),1627static_cast(effectiveApiLevel));16281629sp client = nullptr;1630{1631// Acquire mServiceLock and prevent other clients from connecting1632std::unique_ptr lock =1633AutoConditionLock::waitAndAcquire(mServiceLockWrapper, DEFAULT_CONNECT_TIMEOUT_NS);16341635if (lock == nullptr) {1636ALOGE("CameraService::connect (PID %d) rejected (too many other clients connecting)."1637, clientPid);1638return STATUS_ERROR_FMT(ERROR_MAX_CAMERAS_IN_USE,1639"Cannot open camera %s for \"%s\" (PID %d): Too many other clients connecting",1640cameraId.string(), clientName8.string(), clientPid);1641}16421643// Enforce client permissions and do basic validity checks1644if(!(ret = validateConnectLocked(cameraId, clientName8,1645/*inout*/clientUid, /*inout*/clientPid, /*out*/originalClientPid)).isOk()) {1646return ret;1647}16481649// Check the shim parameters after acquiring lock, if they have already been updated and1650// we were doing a shim update, return immediately1651if (shimUpdateOnly) {1652auto cameraState = getCameraState(cameraId);1653if (cameraState != nullptr) {1654if (!cameraState->getShimParams().isEmpty()) return ret;1655}1656}16571658status_t err;16591660sp