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() 函数。