Почему передняя камера не открывается при использовании Camera2 API?

#android #android-studio #android-camera #android-camera2

#Android #android-studio #android-камера #android-camera2

Вопрос:

Я использую API Camera2 (https://github.com/googlearchive/android-Camera2Basic ) для моего проекта. Я хочу использовать переднюю и заднюю камеры, она работает правильно на моем устройстве Realme5 Android: 10, но когда я пытаюсь использовать переднюю камеру на One Plus 6, Android: 10 или Samsung Galaxy J7 Nxt, Android 7.0 или Redmi. Затем я использую метод onConfigureFailed, и он перенаправляет меня на скриншоты манифеста FirstActivity: введите описание изображения здесь

Скриншоты журнала: введите описание изображения здесь

Весь код в 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();
    }
}
 

Пожалуйста, помогите мне …
Заранее спасибо

Комментарии:

1. мы не собираемся переходить по каким-либо ссылкам, поэтому, пожалуйста, включите в свой вопрос все соответствующие и конкретные разделы кода, тогда люди с радостью помогут

2. @a_local_nobody Спасибо за ответ. теперь я должен добавить некоторый use полный код, связанный с этим, может быть, теперь вы сможете понять. Я уже добавил ссылку googlearchive на github, код которой я использую github.com/googlearchive/android-Camera2Basic

Ответ №1:

Мне нравится, что он будет захватывать изображение в фоновом режиме без какого-либо экрана предварительного просмотра, используя Camera2 API в фоновом режиме.

Посетите https://codepalyers.blogspot.com/2020/12/capture-image-in-background-without.html

Если вы хотите использовать заднюю камеру, используйте закрытую конечную строку frontCamera = «1»; закрытая конечная строка backCamera = «0»; как уже определено в коде.