对android运行时权限感到困惑

对android运行时权限感到困惑,android,android-camera,android-permissions,runtime-permissions,target-sdk,Android,Android Camera,Android Permissions,Runtime Permissions,Target Sdk,所以这个全新的android运行时权限让我感到困惑。我的应用程序目前正在编译并针对版本23,这意味着我必须使用运行时权限。我的应用程序主要使用需要摄像头权限的摄像头api,因此我在打开摄像头之前添加了运行时权限,如下所示: if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSI

所以这个全新的android运行时权限让我感到困惑。我的应用程序目前正在编译并针对版本23,这意味着我必须使用运行时权限。我的应用程序主要使用需要摄像头权限的摄像头api,因此我在打开摄像头之前添加了运行时权限,如下所示:

        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED)
        {//ask permissions for camera
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    CameraPermissions);
        }
        else
        {//permissions attained now you can open the camera
            camera=Camera.open(getCid());
            camera.setPreviewCallback(this);
            initPreview(width, height);
            startPreview();
            startTimer();
        }
当我停止相机时,我也会检查:

       if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) {
            camera.setPreviewCallback(null);
            camera.release();
            faceProc.release();
            faceProc = null;
            camera = null;
            inPreview = false;
            cameraConfigured = false;
        }
权限请求的处理方式如下:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case CameraPermissions: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                StartUpCam();
            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("How is this app going to work if you rejected the camera permission.... DUHHHH!!")
                        .setTitle("Rejected");
                builder.setPositiveButton("Exit App", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        //close application
                        closeApp();
                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
            }
            return;
        }
    }
}
因此,当发出请求时,它会调用StartUpCam,然后在获得许可的情况下尝试打开摄像头。所以我的问题来了,如果我添加这个运行时权限检查这对低于6.0的android设备有何影响??那么,5.0.1版的手机也会收到提示,要求授予摄像头权限?如果使用运行时权限,是否必须删除清单文件中的摄影机权限?目前,我在清单中保留相机权限以及运行时权限,我不知道这是否正确。如果我降低目标并将sdk编译为22而不是23,6.0以上的android设备将无法下载我的应用程序吗???如果我把它降低到22版,那么我就避免了所有这些头痛

我也会检查我什么时候停止相机

这是不必要的,假设你没有试图停止你从未打开过的相机。如果用户在您的应用程序运行时撤销了权限,您的进程将立即终止。因此,在运行中的应用程序中,您永远不会失去权限。由于您已检查并拥有打开相机的权限,因此您已经拥有关闭相机的权限

如果我添加此运行时权限,将检查这对低于6.0的android设备有何影响

ContextCompat.checkSelfPermission()
将返回在旧设备上授予的
PackageManager.PERMISSION\u,前提是您拥有清单中列出的权限

那么,5.0.1版的手机也会收到提示,要求授予摄像头权限

没有

如果使用运行时权限,是否必须删除清单文件中的摄影机权限

不需要。所有Android版本都需要这些元素

如果我降低目标并将sdk编译为22而不是23,6.0以上的android设备将无法下载我的应用程序吗

您的
compileSdkVersion
对您支持的Android版本没有影响。Android 6.0用户仍然可以下载您的应用程序

如果您将
targetSdkVersion
降低到22或更低,这也不会影响您支持的Android版本。Android 6.0用户仍然可以下载您的应用程序。这样做意味着您可以跳过运行时权限代码。但是,请记住,您可能仍然没有获得许可。运行您的
targetSdkVersion
22应用程序的安卓6.0设备用户,默认情况下将授予
CAMERA
权限。但是,这些用户仍然可以进入设置>应用程序,找到你的应用程序,并撤销权限。使用摄影机API,基本上无法打开摄影机


战术上,使用22或更低的
targetSdkVersion
当然是可能的。不过,最终会有一些东西“强迫你”并要求你移动到23或更高的
targetSdkVersion
。所以,有一天,您将需要处理运行时权限。这是今天还是将来的某一天,取决于您的决定。

如果权限在Menifest文件中,则为否。拥有少于23个sdk的Android不会收到关于权限的提示,它将与以前一样

当调用“活动onpause”时,我停止相机,当我执行权限提示时,它到达那里。我的活动转到“onpause”,然后当它没有权限停止相机时,尝试停止相机…您可以检查我创建的一个类,并在Fragments github.com/mptrista/PermissionHelper中使用它,它用于片段和请求单个权限的案例。