Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安装后第一次运行应用程序时摄像头不工作_Java_Android_Camera - Fatal编程技术网

Java 安装后第一次运行应用程序时摄像头不工作

Java 安装后第一次运行应用程序时摄像头不工作,java,android,camera,Java,Android,Camera,我已经在我的Android应用程序中实现了一个简单的QR扫描码。代码似乎工作正常,但由于某些原因,在安装时,当您第一次打开应用程序时,CameraView仍然是黑色的。只有在我第二次启动应用程序后,它才能工作(关闭后,onResume不会更改任何内容) 这是我的密码: private static Context context; private CameraSource cameraSource; private SurfaceView cameraView; private final i

我已经在我的Android应用程序中实现了一个简单的QR扫描码。代码似乎工作正常,但由于某些原因,在安装时,当您第一次打开应用程序时,CameraView仍然是黑色的。只有在我第二次启动应用程序后,它才能工作(关闭后,onResume不会更改任何内容)

这是我的密码:

private static Context context;

private CameraSource cameraSource;
private SurfaceView cameraView;
private final int MY_PERMISSIONS_REQUEST_CAMERA = 1;
private String token = "";
private String tokenanterior = "";
private static Activity mActivity;

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

    // verifico si el usuario dio los permisos para la camara
    if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // verificamos la version de ANdroid que sea al menos la M para mostrar
            // el dialog de la solicitud de la camara
            if (shouldShowRequestPermissionRationale(
                    Manifest.permission.CAMERA)) ;
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    MY_PERMISSIONS_REQUEST_CAMERA);
        }
    }

    cameraView = (SurfaceView) findViewById(R.id.camera_view);
    initQR();

}

public void initQR() {

    // creo el detector qr
    BarcodeDetector barcodeDetector =
            new BarcodeDetector.Builder(this)
                    .setBarcodeFormats(Barcode.ALL_FORMATS)
                    .build();

    // creo la camara
    cameraSource = new CameraSource
            .Builder(this, barcodeDetector)
            .setRequestedPreviewSize(1600, 1024)
            .setAutoFocusEnabled(true) //you should add this feature
            .build();

    // listener de ciclo de vida de la camara
    cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {

            // verifico si el usuario dio los permisos para la camara
            if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    // verificamos la version de ANdroid que sea al menos la M para mostrar
                    // el dialog de la solicitud de la camara
                    if (shouldShowRequestPermissionRationale(
                            Manifest.permission.CAMERA)) ;
                    requestPermissions(new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);
                }
                return;
            }else {
                try {
                    cameraSource.start(cameraView.getHolder());
                } catch (IOException ie) {
                    Log.e("CAMERA SOURCE", ie.getMessage());
                }
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            cameraSource.stop();
        }
    });

    // preparo el detector de QR
    barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
        @Override
        public void release() {
        }
}

但这并没有解决问题,initQR被执行了两次(因为我被要求获得拍摄视频和拍照的许可)。但是,在第一次安装时,它仍然无法在SurfaceView上正确显示摄像头流。

您在清单中实现了许可请求吗?在运行时将它们放在代码之外很重要:

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />

这很简单。当您第一次请求权限时,但没有对用户的允许做出反应。第二次,许可已经被授予。您需要根据以下文档实现onRequestPermissionResult:


基本上,当用户允许您使用摄像头时,您需要
initQr()

唯一的解决方案是在单独的活动中请求权限。
由于我希望首先进行摄像头活动,因此我必须实施一个新的空白活动,完全是为了请求权限,然后继续进行摄像头活动。

谢谢您提供的信息。我已经实现了侦听器函数,它运行得很好。但问题依然存在。请签出编辑。是的,我在清单上设置了这两个说明。谢谢你的回复:)
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />