Android Camera2 API, отключение автофокусировки делает поверхность пустой - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу отключить AF на устройстве, и отчет CameraCharacteristics имеет INFO_SUPPORTED_HARDWARE_LEVEL_3, поэтому я должен иметь возможность это сделать.

Однако, когда я установил для CONTROL_AF_MODE значение OFF, SurfaceHolder просто пустым. Установка чего-то другого, например фильтра сепии, кажется, работает нормально, поэтому я предполагаю, что передаю какое-то недопустимое значение.

Что я могу сделать неправильно? Мой код выглядит следующим образом:

private class CameraStateWatcher extends CameraDevice.StateCallback {

    @Override
    public void onOpened(@NonNull CameraDevice cameraDevice) {

        TestCamera.this.cameraDevice = cameraDevice;

        List<Surface> surfaces = new ArrayList<>();
        surfaces.add(previewSurface);
        surfaces.add(imageReader.getSurface());

        try {
            CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

            captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
            captureRequestBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_SEPIA);

            for ( Surface surface : surfaces ) {
                captureRequestBuilder.addTarget(surface);
            }

            captureRequest = captureRequestBuilder.build();

            for ( CaptureRequest.Key<?> key : captureRequest.getKeys() ) {
                Log.d("STATE_WATCHER", "Request Key = " + key.getName());
            }

            cameraDevice.createCaptureSession(surfaces, cameraSurfaceWatcher, handler);

        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onDisconnected(@NonNull CameraDevice cameraDevice) {

    }

    @Override
    public void onError(@NonNull CameraDevice cameraDevice, int i) {

    }
}

private class SurfaceWatcher implements SurfaceHolder.Callback {

    @Override
    public void surfaceCreated( SurfaceHolder surfaceHolder ) {

        Log.d("SURFACE_CREATOR", "surfacewatcher created");
        TestCamera.this.surfaceHolder = surfaceHolder;
        previewSurface = surfaceHolder.getSurface();

        Rect rect = surfaceHolder.getSurfaceFrame();
        imageReader = ImageReader.newInstance( rect.width(), rect.height(), ImageFormat.YUV_420_888, 2);
        imageReader.setOnImageAvailableListener(imageReaderFrameWatcher,handler);

        openCamera();

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        Log.d("SURFACE_CREATOR", "surfacewatcher changed");
        previewSurface = surfaceHolder.getSurface();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        Log.d("SURFACE_CREATOR", "surfacewatcher destroyed");
        TestCamera.this.surfaceHolder = null;
        previewSurface = null;
    }

}
...