簡體   English   中英

相機光源無法打開手電筒

[英]Flashlight doesn't turn on with Camera Source

我正在使用SurfaceView和CameraSource訪問相機,並在屏幕上顯示圖像。 該應用程序還需要使用閃光燈。 當我打開閃光燈時,相機視圖會凍結。 我不希望這種情況發生。 我不明白為什么。 閃光燈打開時,必須同時啟動相機。 例如,用手機上的閃光燈拍照。 我正在使用以下代碼。 如果您能幫助或指出導致問題的原因,我們將不勝感激。

*我的代碼正在運行。 但是當我打開手電筒時,相機圖像仍然保持連接狀態。

MyActivity

public class MyActivity extends AppCompatActivity {

    SurfaceView cameraPreview;
    CameraSource cameraSource;
    final int RequestCameraPermissionID = 1001;

    ImageButton Flash_On_Button;

    private Camera cam;
    Camera.Parameters p;

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case RequestCameraPermissionID: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    try {
                        cameraSource.start(cameraPreview.getHolder());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            break;
        }
    }

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

        Flash_On_Button  = findViewById(R.id.Flash_On_Button);
        Flash_On_Button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                FlashON();          
            }
        });

        cameraPreview  = findViewById(R.id.cameraPreview);
        cameraSource = new CameraSource
                .Builder(this, barcodeDetector)
                .setAutoFocusEnabled(true)
                .build();

        CameraStart() ;
}


    private void CameraStart() {

                cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
                    @Override
                    public void surfaceCreated(SurfaceHolder surfaceHolder) {
                        if (ActivityCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

                            ActivityCompat.requestPermissions(ScanActivity.this,
                                    new String[]{Manifest.permission.CAMERA},RequestCameraPermissionID);
                            return;
                        }
                        try {
                            cameraSource.start(cameraPreview.getHolder());
                            Toast.makeText(ScanActivity.this, "surface Created", Toast.LENGTH_SHORT).show();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
                        Toast.makeText(ScanActivity.this, "surface Changed", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                        cameraSource.stop();
                        Toast.makeText(ScanActivity.this, "surface Destroyed", Toast.LENGTH_SHORT).show();
                    }
                });

    }


    public void FlashON(){

            try {
                if (getPackageManager().hasSystemFeature(
                        PackageManager.FEATURE_CAMERA_FLASH)) {

                    cam = Camera.open();
                    p = cam.getParameters();

                    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                    cam.setParameters(p);
                    cam.startPreview();

                }
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(getBaseContext(), "Exception flashLightOn()", Toast.LENGTH_SHORT).show();
            }

        }
}

您可以嘗試實現以下代碼:

閃光燈的可用性

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

啟用閃光燈的開/關,將此功能包含在Android清單中

 <!-- Allows access to the flashlight -->
 <permission android:name="android.permission.FLASHLIGHT"
         android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
         android:protectionLevel="normal"
         android:label="@string/permlab_flashlight"
         android:description="@string/permdesc_flashlight" /> 

打開相機手電筒

Camera cam = Camera.open();     
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();

關閉相機手電筒

cam.stopPreview();
cam.release();

完整的討論可以在這里找到

暫無
暫無

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

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