混淆了Android运行时权限

时间:2016-02-07 00:25:19

标签: android android-camera android-permissions runtime-permissions target-sdk

所以这整个新的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版,那么我就避免了这一切......

2 个答案:

答案 0 :(得分:1)

  

我还会检查何时停止相机

假设您没有尝试停止从未打开的相机,则不需要这样做。如果用户在您的应用程序运行时撤消权限,则会立即终止您的进程。因此,您永远不会丢失正在运行的应用程序的权限。由于您已检查并有权打开相机,因此您已获得关闭它的权限。

  

如果我添加此运行时权限检查,这会如何影响低于6.0的Android设备?

假设您拥有清单中列出的权限,

ContextCompat.checkSelfPermission()将在旧设备上返回PackageManager.PERMISSION_GRANTED

  

因此,5.0.1版的手机也会提示给予相机权限吗?

没有

  

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

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

  

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

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

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

从战术上讲,以targetSdkVersion为22或更低的肯定是可能的。然而,最终,某些事情会迫使你的手#34;并要求你移动到23 {或更高}的targetSdkVersion。所以,总有一天,你需要处理运行时权限。无论是今天还是将来的某一天,您都可以自行决定。

答案 1 :(得分:0)

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