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