android.hardware.camera2向下和camera service的通信是通过mCameraService和mRemoteDevice

frameworks/base/core/java/android/hardware/camera2/
/**
* A per-process global camera manager instance, to retain a connection to the camera service,
* and to distribute camera availability notices to API-registered callbacks
*/
private static final class CameraManagerGlobal extends ICameraServiceListener.Stub
        /**
         * Connect to the camera service if it's available, and set up listeners.
         */
private static final String CAMERA_SERVICE_BINDER_NAME = "media.camera";
        private void connectCameraServiceLocked() {
            IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME);

            ICameraService cameraService = ICameraService.Stub.asInterface(cameraServiceBinder);

            CameraMetadataNative.setupGlobalVendorTagDescriptor();


            try {
                CameraStatus[] cameraStatuses = cameraService.addListener(this);
                for (CameraStatus c : cameraStatuses) {
                    onStatusChangedLocked(c.status, c.cameraId);
                }
                mCameraService = cameraService;
            }
        }
}
通过JNI调用setupGlobalVendorTagDescriptor,natice层也是调用CameraService做具体的实现。


CameraManager通过CameraMangerGlobal工作:
public void openCamera(@NonNull String cameraId,
            @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler) ->
public void openCameraForUid(@NonNull String cameraId,
    @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler,
    int clientUid) ->
private CameraDevice openCameraDeviceUserAsync(String cameraId,
    CameraDevice.StateCallback callback, Handler handler, final int uid){
        CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
        CameraDevice device = null;


   ICameraDeviceUser cameraUser = null;
   android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
   new android.hardware.camera2.impl.CameraDeviceImpl(
       cameraId,
       callback,
       handler,
       characteristics,
       mContext.getApplicationInfo().targetSdkVersion);
            ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
   // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices
            ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
            cameraUser = cameraService.connectDevice(callbacks, cameraId,
                    mContext.getOpPackageName(), uid);
            deviceImpl.setRemoteDevice(cameraUser);
            device = deviceImpl;
        return device;
}

CameraDevice, CameraDeviceImpl, ICameraDeviceUser三者之间的关系:
public class CameraDeviceImpl extends CameraDevice
public void setRemoteDevice(ICameraDeviceUser remoteDevice) throws CameraAccessException {
    mRemoteDevice = new ICameraDeviceUserWrapper(remoteDevice);
    mDeviceHandler.post(mCallOnOpened);
    mDeviceHandler.post(mCallOnUnconfigured);
}


1. 通过ICameraService接口访问ICameraService.aidl

ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
ICameraDeviceUser cameraUser=
cameraService . connectDevice ( callbacks , cameraId , mContext . getOpPackageName (), uid );

   
mRemoteDevice = new ICameraDeviceUserWrapper(cameraUser);


2. 通过ICameraDeviceUserWrapper mRemoteDevice访问ICameraDeviceUser.aidl

这里Wrapper的意思只是多了异常捕捉而已

    public void prepare(int streamId) throws CameraAccessException {        try {            mRemoteDevice.prepare(streamId);        } catch (Throwable t) {            CameraManager.throwAsPublicException(t);            throw new UnsupportedOperationException("Unexpected exception", t);        }    }

更多相关文章

  1. Android(安卓)Wifi模块分析(三)
  2. Android中dispatchDraw分析
  3. Android四大基本组件介绍与生命周期
  4. Android(安卓)Service AIDL
  5. Android调用天气预报的WebService简单例子
  6. android打电话发短信
  7. android 拨打紧急号码,通话时开启免提功能实现
  8. Android调用.NET Webservice报org.ksoap2.serialization.SoapPri
  9. android 自定义view

随机推荐

  1. Android(安卓)4.0 Ice Cream Sandwich Me
  2. android - Content-Type大全
  3. 【AS-AndroidX】AndroidX迁移-常用控件和
  4. Android: 在WebView中获取网页源码
  5. xml文件的序列化示例
  6. H5判断IOS或Android
  7. 进度条、拖动条
  8. Android(安卓)Studio报错
  9. Android(安卓)实现相机功能【完整源码】
  10. nginx android app 慢网络请求超时