Как отключить всю автоматику в Android Camera2 API


person Tyler Shin    schedule 29.01.2017    source источник


Ответы (1)


Есть два места, где вы можете выполнить эти настройки:

  • Если вы хотите сделать это до начала предварительного просмотра, лучше всего будет внутри переопределенного метода onConfigured внутри createCameraPreviewSession() void (строка 696 в Camera2BasicFragment, представленный в Camera2Basic пример:

    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 {
    
    
                            //Place here your custom camera settings
    
    
                            // 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();
        }
    }
    
  • Если вы хотите выполнить настройки после запуска предварительного просмотра и во время выполнения, просто вызовите disableAutomatics() из пользовательского интерфейса или из любого другого места, и все должно работать нормально.

Обратите внимание, что вам не нужно закрывать старый CaptureSession, вызывая его метод CaptureSession.close(), как описано в ответе на это другой вопрос, потому что новый заменяет старый.


С другой стороны, я не уверен в установке значения времени экспозиции вручную, как вы это сделали в своем вопросе:

mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 1000000L);

потому что вы можете получить неожиданные результаты, различающиеся на разных устройствах. Что я знаю, так это то, что это обычно не рекомендуется, и вместо этого предпочтительнее позволить камере настроиться самостоятельно, а затем вызвать блокировку AE (автоэкспозиции):

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);

Вы можете проверить CONTROL_AE_LOCK ссылку здесь.

Но если вашему коду требуется фиксированное время экспозиции, он должен работать.

person Endor 8    schedule 17.11.2017