簡體   English   中英

為什么打開閃光燈會改變相機的對焦模式?

[英]Why turning on flash change the focus mode of the camera?

我有2個AF對焦距離,可以通過按鈕和一個用於閃光燈的On Off開關來控制。

為什么如果IFELSE在updatePreview()中的flashligh會影響自動對焦模式? 當我注釋掉該部分(如果為flashligh為IF ELSE)時,自動對焦模式和對焦距離可與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();
        }
    }

預期產量

可以手動打開和關閉閃光燈而不會影響對焦模式。

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();
        }
    }

我認為您的問題可能出在您設置請求的方式上。 您應該首先創建預覽,並且只能按照自己的方式創建一次,每次切換閃光燈和/或對焦時都將創建預覽。 我建議使用一些默認值在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();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM