【问题标题】:Why does the front camera not open, when using Camera2 API?为什么使用 Camera2 API 时前置摄像头打不开?
【发布时间】:2020-12-10 12:14:51
【问题描述】:

我正在为我的项目使用 Camera2 API (https://github.com/googlearchive/android-Camera2Basic)。 我想同时使用前置和后置摄像头,它在我的设备上正常工作 Realme5 安卓:10 但是当我尝试使用前置摄像头时 一加 6,Android:10 或三星 Galaxy J7 Nxt,Android 7.0 或 Redmi。 然后我继续 onConfigureFailed 方法,它重定向我 firstActivity 清单截图enter image description here

日志截图enter image description here

上面给出了googlearchive GitHub链接中的完整代码

变量初始化

 private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
private static final int REQUEST_CAMERA_PERMISSION = 1;
private static final String FRAGMENT_DIALOG = "dialog";

static {
    ORIENTATIONS.append(Surface.ROTATION_0, 90);
    ORIENTATIONS.append(Surface.ROTATION_90, 0);
    ORIENTATIONS.append(Surface.ROTATION_180, 270);
    ORIENTATIONS.append(Surface.ROTATION_270, 180);
}
public static int  mSelectedFacing = 1;

翻转相机按钮点击

            if (mTextureView.isAvailable()) {
                if(mSelectedFacing ==0){
                    mSelectedFacing = 1;
                }else {
                    mSelectedFacing = 0;
                }
                closeCamera();
                openCamera(mTextureView.getWidth(), mTextureView.getHeight(), mSelectedFacing);

            } else {
                mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
            }

打开相机

private void openCamera(int width, int height,int mSelectedFacing) {
    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {
        requestCameraPermission();
        return;
    }
    setUpCameraOutputs(width, height,mSelectedFacing);
    configureTransform(width, height);
    Activity activity = getActivity();
    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
    try {
        if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
            throw new RuntimeException("Time out waiting to lock camera opening.");
        }
        manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted while trying to lock camera opening.", e);
    }
}

关闭相机

private void closeCamera() {
    try {
        mCameraOpenCloseLock.acquire();
        if (null != mCaptureSession) {
            mCaptureSession.close();
            mCaptureSession = null;
        }
        if (null != mCameraDevice) {
            mCameraDevice.close();
            mCameraDevice = null;
        }
        if (null != mImageReader) {
            mImageReader.close();
            mImageReader = null;
        }
    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
    } finally {
        mCameraOpenCloseLock.release();
    }
}

CameraPreviewSession

 private void createCameraPreviewSession() {
    try {
        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        assert texture != null;

        // We configure the size of default buffer to be the size of camera preview we want.
        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

        // This is the output Surface we need to start preview.
        Surface surface = new Surface(texture);

        // We set up a CaptureRequest.Builder with the output Surface.
        mPreviewRequestBuilder
                = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mPreviewRequestBuilder.addTarget(surface);

        // Here, we create a CameraCaptureSession for camera preview.
        mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
                new CameraCaptureSession.StateCallback() {

                    @Override
                    public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                        // The camera is already closed
                        if (null == mCameraDevice) {
                            return;
                        }

                        // When the session is ready, we start displaying the preview.
                        mCaptureSession = cameraCaptureSession;
                        try {
                            // Auto focus should be continuous for camera preview.
                            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                            // Flash is automatically enabled when necessary.
                            setAutoFlash(mPreviewRequestBuilder);

                            // Finally, we start displaying the camera preview.
                            mPreviewRequest = mPreviewRequestBuilder.build();
                            mCaptureSession.setRepeatingRequest(mPreviewRequest,
                                    mCaptureCallback, mBackgroundHandler);
                        } catch (CameraAccessException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onConfigureFailed(
                            @NonNull CameraCaptureSession cameraCaptureSession) {
                        showToast("Failed");
                    }
                }, null
        );
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

请帮帮我…… 提前致谢

【问题讨论】:

  • 我们不会点击任何链接,因此请在您的问题中包含所有相关和特定的代码部分,然后人们会很乐意提供帮助
  • @a_local_nobody 感谢您的回复。现在我添加了一些与此相关的使用完整代码,也许现在您可以理解了。我已经添加了我正在使用的 googlearchive github 链接 github.com/googlearchive/android-Camera2Basic

标签: android android-studio android-camera android-camera2


【解决方案1】:

我确实喜欢它会在后台使用 Camera2 API 在后台服务中捕获图像而无需任何预览屏幕。

访问https://codepalyers.blogspot.com/2020/12/capture-image-in-background-without.html

如果您想使用后置摄像头,请使用 私人最终字符串frontCamera =“1”; 私人最终字符串 backCamera = "0"; 正如代码中已经定义的那样。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多