Java 为什么我的应用程序显示两个requestpermissionreasonals?

Java 为什么我的应用程序显示两个requestpermissionreasonals?,java,android,android-camera,android-permissions,Java,Android,Android Camera,Android Permissions,我对编程比较陌生,刚刚制作了一个摄像头应用程序,在surfaceview中有一个预览窗口,需要访问该位置,当然还有摄像头 但是,在显示权限的requestPermissionRegulation后,在用户同意后,会出现第二个requestPermissionRegulation,将相机预览冻结到位。预览在离开应用程序并返回时生效。为什么会这样 我在下面介绍了请求权限的方法、我的surfaceview类和logcatrequestUpdates()包括实例化相机的代码,在onCreate()中调用

我对编程比较陌生,刚刚制作了一个摄像头应用程序,在surfaceview中有一个预览窗口,需要访问该位置,当然还有摄像头

但是,在显示权限的
requestPermissionRegulation
后,在用户同意后,会出现第二个
requestPermissionRegulation
,将相机预览冻结到位。预览在离开应用程序并返回时生效。为什么会这样

我在下面介绍了请求权限的方法、我的surfaceview类和logcat
requestUpdates()
包括实例化相机的代码,在
onCreate()中调用
surfaceview.request()
。如下所示,请求在
onResume()
中调用,它也在
onCreate()中调用


首先,代码中有一个逻辑错误。您的权限检查和权限请求不匹配。请在代码中输入注释:

   public void request() {
        if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {
            requestUpdates();
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//You are checking for Location permission grant status but requesting camera permission
            requestCam();
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
//You are checking for Camera permission grant status but requesting location permission
            requestLoc();
        } else {
            requestBoth();
        }
    }
您看到两个理由的原因如下:

您正在
onResume()
中请求权限

当您请求权限时,Android操作系统会在内部启动一个新的活动,以显示权限对话框并覆盖您当前的活动。当用户授予权限时,您的活动将进入前台,并将调用
onResume()
。因此,您将看到另一个理由


您可以通过仅检查和请求(如有必要)onCreate()中的权限来避免此问题,并仅在授予权限后触发访问摄像头的请求。

尝试以这种方式实现(即使用单个语句请求权限)


您是否可以更新代码,指明调用方法的位置
requestCam()
requestLoc()
requesttweath()
?你是在
onResume()
还是
onStart()
上做的?我更新了它。这些方法通过request()方法简化,该方法在onResume()和onCreate()中调用。
   public void request() {
        if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) && (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {
            requestUpdates();
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//You are checking for Location permission grant status but requesting camera permission
            requestCam();
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
//You are checking for Camera permission grant status but requesting location permission
            requestLoc();
        } else {
            requestBoth();
        }
    }
@TargetApi(23)
protected void requestBoth() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION) && ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
        showMessageOKCancel("This app requires access to both the location and the camera in order to function.",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA}, MULT_KEY);
                       // requestPermissions(new String[] {Manifest.permission.CAMERA}, CAMPERMISSION_KEY);
                    }
                });

    } else {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA}, MULT_KEY);
    }

}