Camera2 openCamera

来源:互联网 发布:语义搜索python 编辑:程序博客网 时间:2024/04/30 12:50

Camera2 中,CameraManager.java管理所有camera设备,

获取cameraManager:

mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);

打开camera:

mCameraManager.openCamera(mCameraId, DeviceStateCallback, mHandler);

打开camera过程:

    public void openCamera(@NonNull String cameraId,            @NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler)            throws CameraAccessException {        if (cameraId == null) {            throw new IllegalArgumentException("cameraId was null");        } else if (callback == null) {            throw new IllegalArgumentException("callback was null");        } else if (handler == null) {            if (Looper.myLooper() != null) {                handler = new Handler();            } else {                throw new IllegalArgumentException(                        "Handler argument is null, but no looper exists in the calling thread");            }        }        openCameraDeviceUserAsync(cameraId, callback, handler);

openCameraDeviceUserAsync:

   private CameraDevice openCameraDeviceUserAsync(String cameraId,            CameraDevice.StateCallback callback, Handler handler)            throws CameraAccessException {        CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);        CameraDevice device = null;        try {            synchronized (mLock) {                ICameraDeviceUser cameraUser = null;                android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =                        new android.hardware.camera2.impl.CameraDeviceImpl(                                cameraId,                                callback,                                handler,                                characteristics);                BinderHolder holder = new BinderHolder();                ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();                int id = Integer.parseInt(cameraId);                try {                    if (supportsCamera2ApiLocked(cameraId)) {    //到CameraService.cpp中查询是否支持API2 ,需要HAL支持ModuleApiVersion >= CAMERA_MODULE_API_VERSION_2_0                        // Use cameraservice's cameradeviceclient implementation for HAL3.2+ devices                        ICameraService cameraService = CameraManagerGlobal.get().getCameraService();                        if (cameraService == null) {                            throw new CameraRuntimeException(                                CameraAccessException.CAMERA_DISCONNECTED,                                "Camera service is currently unavailable");                        }                        cameraService.connectDevice(callbacks, id,                                mContext.getOpPackageName(), USE_CALLING_UID, holder);                        cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder());//API2.0,获取native层Client                    } else {  //CameraDeviceUserShim 兼容API1.0, 在java层使用camera.java通过JNI与native层通信。                        // Use legacy camera implementation for HAL1 devices                        Log.i(TAG, "Using legacy camera HAL.");                        cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks, id);                     }                } catch (CameraRuntimeException e) {                    if (e.getReason() == CameraAccessException.CAMERA_DEPRECATED_HAL) {                        throw new AssertionError("Should've gone down the shim path");                    } else if (e.getReason() == CameraAccessException.CAMERA_IN_USE ||                            e.getReason() == CameraAccessException.MAX_CAMERAS_IN_USE ||                            e.getReason() == CameraAccessException.CAMERA_DISABLED ||                            e.getReason() == CameraAccessException.CAMERA_DISCONNECTED ||                            e.getReason() == CameraAccessException.CAMERA_ERROR) {                        // Received one of the known connection errors                        // The remote camera device cannot be connected to, so                        // set the local camera to the startup error state                        deviceImpl.setRemoteFailure(e);                        if (e.getReason() == CameraAccessException.CAMERA_DISABLED ||                                e.getReason() == CameraAccessException.CAMERA_DISCONNECTED ||                                e.getReason() == CameraAccessException.CAMERA_IN_USE) {                            // Per API docs, these failures call onError and throw                            throw e.asChecked();                        }                    } else {                        // Unexpected failure - rethrow                        throw e;                    }                } catch (RemoteException e) {                    // Camera service died - act as if it's a CAMERA_DISCONNECTED case                    CameraRuntimeException ce = new CameraRuntimeException(                        CameraAccessException.CAMERA_DISCONNECTED,                        "Camera service is currently unavailable", e);                    deviceImpl.setRemoteFailure(ce);                    throw ce.asChecked();                }                // TODO: factor out callback to be non-nested, then move setter to constructor                // For now, calling setRemoteDevice will fire initial                // onOpened/onUnconfigured callbacks.                deviceImpl.setRemoteDevice(cameraUser);                device = deviceImpl;            }        } catch (NumberFormatException e) {            throw new IllegalArgumentException("Expected cameraId to be numeric, but it was: "                    + cameraId);        } catch (CameraRuntimeException e) {            throw e.asChecked();        }        return device;    }

API1.0通过camera.java---->JNI----->cameraclient。

API2.0通过java层获取到底层CameraClient,使用binder与service通信。


0 0