Camera2中的前置摄像头不能捕获图像

Vee*_*sh 10 android

我有来自https://github.com/googlesamples/android-Camera2Basic的Camera2的代码.

我面临的问题是,当我转向我的前置摄像头时,我无法捕捉图片,但使用后置摄像头可以正常工作.

有没有人实施Camera2 Api请帮忙!

这是代码片段:

private void setUpCameraOutputs(int width, int height) {
    Activity activity = getActivity();
    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
    try {
        for (String cameraId : manager.getCameraIdList()) {
            CameraCharacteristics characteristics
                    = manager.getCameraCharacteristics(cameraId);

            // We don't use a front facing camera in this sample.
            int facing = characteristics.get(CameraCharacteristics.LENS_FACING);
            Log.i(TAG,"Front Cam ID: "+ facing);
            if (characteristics.get(CameraCharacteristics.LENS_FACING)==CameraCharacteristics.LENS_FACING_FRONT)
            {



                StreamConfigurationMap map = characteristics.get(
                        CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);


                // For still image captures, we use the largest available size.
                Size largest = Collections.max(
                        Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)),
                        new CompareSizesByArea());
                mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
                        ImageFormat.JPEG, /*maxImages*/2);
                mImageReader.setOnImageAvailableListener(
                        mOnImageAvailableListener, mBackgroundHandler);

                // Danger, W.R.! Attempting to use too large a preview size could  exceed the camera
                // bus' bandwidth limitation, resulting in gorgeous previews but the storage of
                // garbage capture data.
                mPreviewSize = chooseOptimalSize(map.getOutputSizes(SurfaceTexture.class),
                        width, height, largest);

                // We fit the aspect ratio of TextureView to the size of preview we picked.
                int orientation = getResources().getConfiguration().orientation;
                if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                    mTextureView.setAspectRatio(
                            mPreviewSize.getWidth(), mPreviewSize.getHeight());
                } else {
                    mTextureView.setAspectRatio(
                            mPreviewSize.getHeight(), mPreviewSize.getWidth());
                }

                mCameraId = cameraId;
                return;
            }
            else
            {
                onActivityCreated(Bundle.EMPTY);
            }
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (NullPointerException e) {
        // Currently an NPE is thrown when the Camera2API is used but not supported on the
        // device this code runs.
        ErrorDialog.newInstance(getString(R.string.camera_error))
                .show(getChildFragmentManager(), FRAGMENT_DIALOG);
    }
}
Run Code Online (Sandbox Code Playgroud)

Dir*_*irk 28

问题是许多前置摄像头具有固定的焦距.因此,在自动lockFocus()对焦状态(CONTROL_AF_STATE)中的自动对焦触发器保持INACTIVE状态后,自动对焦触发器不执行任何操作.

因此,为了使其工作,您需要检查是否支持自动对焦.为此,请将以下内容添加到setUpCameraOutputs():

int[] afAvailableModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);

if (afAvailableModes.length == 0 || (afAvailableModes.length == 1
        && afAvailableModes[0] == CameraMetadata.CONTROL_AF_MODE_OFF)) {
    mAutoFocusSupported = false;
} else {
    mAutoFocusSupported = true;
}
Run Code Online (Sandbox Code Playgroud)

如果你想拍照时不支持,请不要锁定焦点:

private void takePicture() {
    if (mAutoFocusSupported) {
        lockFocus();
    } else {
        captureStillPicture();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 13

对于Camera2 Api,Google的视频示例适用于前后摄像头,但对于图像捕捉,Google的示例仅适用于后置摄像头,而不适用于前置摄像头.
适合我的解决方案是

lockFocus()方法中,替换线

mCaptureSession.capture(mPreviewRequestBuilder.build(),
                                                  mCaptureCallback, mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)

captureStillPicture();
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助!!