android camera2配置流程
来源:互联网 发布:sqlserver存储过程语法 编辑:程序博客网 时间:2024/06/07 07:39
更新camera配置通过CameraAgent.CameraProxy.applySettings()实现
在camera_API1中
AndroidCameraAgentImpl.java
public boolean applySettings(CameraSettings settings) { return applySettingsHelper(settings, AndroidCameraStateHolder.CAMERA_IDLE | AndroidCameraStateHolder.CAMERA_UNLOCKED);}
CameraAgent.java
protected boolean applySettingsHelper(CameraSettings settings, final int statesToAwait) { if (settings == null) { Log.v(TAG, "null argument in applySettings()"); return false; } if (!getCapabilities().supports(settings)) { Log.w(TAG, "Unsupported settings in applySettings()"); return false; } final CameraSettings copyOfSettings = settings.copy(); getDispatchThread().runJob(new Runnable() { @Override public void run() { getCameraState().waitForStates(statesToAwait); getCameraHandler().obtainMessage(CameraActions.APPLY_SETTINGS, copyOfSettings) .sendToTarget(); }}); return true;}
camera的配置会保存在CameraSettings,然后通过settings.copy()将它镜像出一份,通过CameraActions.APPLY_SETTINGS消息发送给
AndroidCameraAgentImpl去接收,
case CameraActions.APPLY_SETTINGS: { Parameters parameters = mParameterCache.getBlocking(); CameraSettings settings = (CameraSettings) msg.obj; applySettingsToParameters(settings, parameters); mCamera.setParameters(parameters); mParameterCache.invalidate(); break;}
通过applySettingsToParameters(settings, parameters);进行处理最后通过mCamera.setParameters(parameters);来使它生效。
在最新的camea_API2中,流程会有所不同,具体看如下
AndroidCamera2AgentImpl.java
@Overridepublic boolean applySettings(CameraSettings settings) { if (settings == null) { Log.w(TAG, "null parameters in applySettings()"); return false; } if (!(settings instanceof AndroidCamera2Settings)) { Log.e(TAG, "Provided settings not compatible with the backing framework API"); return false; } // Wait for any state that isn't OPENED //这里和API1中一样调用CameraAgent的applySettingsHelper函数 if (applySettingsHelper(settings, ~AndroidCamera2StateHolder.CAMERA_UNOPENED)) { mLastSettings = settings; return true; } return false;}case CameraActions.APPLY_SETTINGS: { AndroidCamera2Settings settings = (AndroidCamera2Settings) msg.obj; applyToRequest(settings); break;}private void applyToRequest(AndroidCamera2Settings settings) { // TODO: If invoked when in PREVIEW_READY state, a new preview size will not take effect //将配置信息保存到Camera2RequestSettingsSet的mDictionary中 mPersistentSettings.union(settings.getRequestSettings()); mPreviewSize = settings.getCurrentPreviewSize(); mPhotoSize = settings.getCurrentPhotoSize(); if (mCameraState.getState() >= AndroidCamera2StateHolder.CAMERA_PREVIEW_ACTIVE) { // If we're already previewing, reflect most settings immediately try { //通过这里将mDictionary中的配置写入camera硬件中 mSession.setRepeatingRequest( mPersistentSettings.createRequest(mCamera, CameraDevice.TEMPLATE_PREVIEW, mPreviewSurface), /*listener*/mCameraResultStateCallback, /*handler*/this); } catch (CameraAccessException ex) { Log.e(TAG, "Failed to apply updated request settings", ex); } } else if (mCameraState.getState() < AndroidCamera2StateHolder.CAMERA_PREVIEW_READY) { // If we're already ready to preview, this doesn't regress our state changeState(AndroidCamera2StateHolder.CAMERA_CONFIGURED); }}
Camera2RequestSettingsSet.java
//mPersistentSettings.createRequest函数如下public CaptureRequest createRequest(CameraDevice camera, int template, Surface... targets) throws CameraAccessException { if (camera == null) { throw new NullPointerException("Tried to create request using null CameraDevice"); } //创建CaptureRequest.Builder Builder reqBuilder = camera.createCaptureRequest(template); //将保存在mDictionary中的camera配置信息保存到reqBuilder内的CameraMetadataNative中, //CameraMetadataNative最后会通过JNI方法CameraMetadata_writeValues更新数据 for (Key<?> key : mDictionary.keySet()) { setRequestFieldIfNonNull(reqBuilder, key); } for (Surface target : targets) { if (target == null) { throw new NullPointerException("Tried to add null Surface as request target"); } reqBuilder.addTarget(target); } return reqBuilder.build();}
到此java层的基本流程就告一段落。可以通过adb shell dumpsys media.camera查看camera配置。
0 0
- android camera2配置流程
- android camera2启动流程
- android camera2 拍照流程
- Android camera2预览界面流程
- android camera2 API流程分析
- android camera2人脸识别流程分析
- android camera2
- Android camera2
- Android -- Camera2(Android5.0)
- Android 5.0 Camera2 介绍
- Android -- Camera2(Android5.0)
- android.hardware.camera2使用指南
- Android -- Camera2(Android5.0)
- android.hardware.camera2使用指南
- Android.Camera2 API
- Android -- Camera2(Android5.0)
- android.hardware.camera2使用指南
- android.hardware.camera2使用指南
- Android Lollipop新特性
- 图(并查集) 5
- Scala数组相关的操作
- Item 9: 比起typedef更偏爱别名声明(alias declaration)
- 百度echarts的使用
- android camera2配置流程
- Item 10: 比起unscoped enum更偏爱scoped enum
- 如何从把mysql的数据迁移到oracle上来---------Oracle SQL Developer技术
- Item 11: 比起private undefined function优先使用deleted function
- C++lambda详解~读书笔记
- Android缓存文件的存放
- swift基础(四):条件语句
- 欢迎使用CSDN-markdown编辑器
- 超棒的 15 款 Bootstrap UI 编辑器