Android 在用户授予相机权限后重新启动 activity
Android restart activity after user grants camera permissions
在我的 android 应用程序中,我使用相机扫描条形码。当 activity 第一次启动时,它会要求用户授予相机权限。
用户接受权限后,摄像头不工作,只有用户离开再回到activity。然后相机扫描仪正在工作。因此我想在用户接受权限后重新启动 activity。
我的代码:
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
if (ActivityCompat.checkSelfPermission(AddOsivo.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
cameraSource.start(surfaceView.getHolder());
} else {
ActivityCompat.requestPermissions(AddOsivo.this, new
String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
recreate();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
如您所见,在我请求权限的情况下,我输入了 recreate();
这工作正常,但有一个问题 - activity 在显示权限警报时循环重新启动,直到用户接受它。之后一切正常,但我不想重新启动 activity 除非用户接受权限。
您应该使用 onRequestPermissionsResult
回调:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == REQUEST_CAMERA_PERMISSION){
if(hasAllPermissionsGranted(grantResults)){
cameraSource.start(surfaceView.getHolder());
}
}
}
public boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
将此添加到您的 class 并删除 recreate()
函数。
在我的 android 应用程序中,我使用相机扫描条形码。当 activity 第一次启动时,它会要求用户授予相机权限。
用户接受权限后,摄像头不工作,只有用户离开再回到activity。然后相机扫描仪正在工作。因此我想在用户接受权限后重新启动 activity。
我的代码:
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
if (ActivityCompat.checkSelfPermission(AddOsivo.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
cameraSource.start(surfaceView.getHolder());
} else {
ActivityCompat.requestPermissions(AddOsivo.this, new
String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
recreate();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
如您所见,在我请求权限的情况下,我输入了 recreate();
这工作正常,但有一个问题 - activity 在显示权限警报时循环重新启动,直到用户接受它。之后一切正常,但我不想重新启动 activity 除非用户接受权限。
您应该使用 onRequestPermissionsResult
回调:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == REQUEST_CAMERA_PERMISSION){
if(hasAllPermissionsGranted(grantResults)){
cameraSource.start(surfaceView.getHolder());
}
}
}
public boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
将此添加到您的 class 并删除 recreate()
函数。