对android运行时权限感到困惑

Posted

技术标签:

【中文标题】对android运行时权限感到困惑【英文标题】:confused about android runtime permissions 【发布时间】:2016-05-16 20:29:40 【问题描述】:

所以这个全新的 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,那么我就避免了所有这些头痛......

【问题讨论】:

你可以在 Fragments github.com/mptrista/PermissionHelper 中查看我创建的一个类并使用它,它是用于片段和请求单个权限的情况。 【参考方案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 权限。但是,这些用户仍然可以进入“设置”>“应用程序”,找到您的应用程序并撤销权限。使用camera API,基本上是打不开摄像头的。

从战术上讲,使用 22 或更低的 targetSdkVersion 肯定是可能的。不过,最终,有些东西会“强迫你的手”,并要求你移动到 23 或更高的targetSdkVersion。因此,总有一天,您将需要处理运行时权限。是今天还是未来的某一天,由您决定。

【讨论】:

我在调用活动 onpause 时停止摄像头,当我执行权限提示时它会到达那里我的活动进入暂停状态,然后在没有权限时尝试停止摄像头所以...【参考方案2】:

如果权限在 Menifest 文件中,则否。少于 23 sdk 的 Android 不会收到权限提示,和之前一样。

【讨论】:

以上是关于对android运行时权限感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

Android 6.0+ 运行时权限探索

Android6.0运行时权限

Android 6.0运行时权限简析及最佳实践

对启动模式感到困惑

Android运行时权限申请快速学习教程

对 Android 中的触觉反馈感到困惑