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