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
- Camera2 openCamera
- Android Multimedia框架总结(十六)Camera2框架之openCamera及session过程
- camera2
- camera2
- opencamera相机开发
- Camera2 doc
- Camera2 YUV420_888
- camera2 应用
- android camera2
- Android camera2
- OpenCamera源码阅读之XML解析
- Android -- Camera2(Android5.0)
- Android 5.0 Camera2 介绍
- Android -- Camera2(Android5.0)
- android camera2启动流程
- android.hardware.camera2使用指南
- Android -- Camera2(Android5.0)
- android.hardware.camera2使用指南
- javascript基础 图片雪碧动画
- 面相对象-学习笔记-java容器与泛型
- shiro初步 shiro认证
- LeetCode476. Number Complement位操作面试题
- 使用开源软件快速搭建数据分析平台
- Camera2 openCamera
- Oracle启动EM报错的解决方法
- 【LeetCode】 398. Random Pick Index
- 77. Combinations**
- 个人笔记
- Paint the Grid Reloaded zoj3781(缩点+dfs + bfs 染色)
- 初见数据结构
- APACHE KYLIN™ 概览
- 2016 Summary