Почему при включении вспышки меняется режим фокусировки камеры? - PullRequest
2 голосов
/ 11 июня 2019

У меня есть 2 AF Фокусное расстояние можно контролировать с помощью кнопки и выключателя для вспышки.

Почему IF ELSE для фонарика в updatePreview () повлияет на режим фокусировки на автоматический? Когда я закомментирую эту часть (IF ELSE для фонарика), режим AF и расстояние фокусировки работают нормально с btnFocus.

Как решить эту проблему, пока пользователь может включать и выключать фонарик?

    private float focusDistance = 0;
    private int flashSwitch = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textureView = (TextureView)findViewById(R.id.textureView);
        //From Java 1.4 , you can use keyword 'assert' to check expression true or false
        assert textureView != null;
        textureView.setSurfaceTextureListener(textureListener);
        btnFocus = (Button)findViewById(R.id.btnFocus);
        btnFlash = (Button)findViewById(R.id.btnFlash);
        btnFocus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                changeFocus();
            }
        });
        btnFlash.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Flash();
            }
        });
    }

    private void Flash() {
        if(cameraDevice == null)
            return;
        if(flashSwitch == 0 ) {
            Toast.makeText(MainActivity.this, "Flash Turn On ", Toast.LENGTH_SHORT).show();
            flashSwitch = 1;
        }
        else{
            Toast.makeText(MainActivity.this, "Flash Turn Off ", Toast.LENGTH_SHORT).show();
            flashSwitch = 0;
        }
        createCameraPreview();
    }


    private void changeFocus() {
        if(cameraDevice == null)
            return;
        if(focusDistance == 0 )
            focusDistance = 10;
        else
            focusDistance = 0;
        Toast.makeText(MainActivity.this, "Focus Change "+ focusDistance, Toast.LENGTH_SHORT).show();
        createCameraPreview();
    }

    private void createCameraPreview() {
        try{
            SurfaceTexture texture = textureView.getSurfaceTexture();
            assert  texture != null;
            texture.setDefaultBufferSize(imageDimension.getWidth(),imageDimension.getHeight());
            Surface surface = new Surface(texture);
            captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            captureRequestBuilder.addTarget(surface);
            cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                    if(cameraDevice == null)
                        return;
                    cameraCaptureSessions = cameraCaptureSession;
                    updatePreview();
                }

                @Override
                public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                    Toast.makeText(MainActivity.this, "Changed", Toast.LENGTH_SHORT).show();
                }
            },null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

Если вы раскомментируете часть, проблема возникнет при включении вспышки и изменении фокуса.

    private void updatePreview() {
        if(cameraDevice == null)
            Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
        try{
//            if you uncomment this part the problem will come out 
//            if(flashSwitch == 0){
//                captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
//            }
//            else{
//                captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
//            }
            captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_OFF);
            captureRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, focusDistance);
            cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(),null,mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

Ожидаемый результат

Можно вручную включать и выключать вспышку, не влияя на режим фокусировки.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я думаю, что ваша проблема может быть в том, как вы устанавливаете запросы. Вы должны создать предварительный просмотр сначала и только один раз, так, как у вас есть, вы создаете предварительный просмотр каждый раз, когда вы переключаете вспышку и / или фокус. Я предлагаю создать предварительный просмотр в onStart с некоторыми значениями по умолчанию, такими как:

focusDistance = 0;
flashSwitch = CaptureRequest.FLASH_MODE_OFF;

А затем во Flash () и changeFocus() вместо вызова createCameraPreview(), который вы вызываете updatePreview(), ваш предварительный просмотр обновления будет выглядеть примерно так:

private void updatePreview() {
        if(cameraDevice == null)
            Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
        try{
            captureRequestBuilder.set(CaptureRequest.FLASH_MODE, flashSwitch);
            captureRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, focusDistance);    
            cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(),null,mBackgroundHandler);

        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
0 голосов
/ 11 июня 2019

В updatePreview() вы отправляете несколько запросов захвата на cameraCaptureSessions, прежде чем все ключи вводятся в captureRequestBuilder.Попытка сначала установить все ключи, а затем отправить один повторный запрос захвата.

private void updatePreview() {
        if(cameraDevice == null)
            Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
        try{
            if(flashSwitch == 0){
                captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
            }
            else{
                captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
            }
            captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_OFF);
            captureRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, focusDistance);

            cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(),null,mBackgroundHandler);

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