Android 6.0 权限申请

作者: 马志炜 | 来源:发表于2016-08-05 16:04 被阅读0次

    Android 6.0 的发布已经将近一年了,其中引入了一个比较重要的新特性:单个应用的权限可以被管理了,用户可以开启或关闭一个应用的任意一个权限。这就需要我们对这个特性进行适配。
    通过查看 Google 官网的教程 Requesting Permissions at Run Time ,可以快速的了解进行权限申请,以及权限申请的处理方法。

    权限申请

    这里贴出请求权限的方法,在需要权限的地方:

    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(thisActivity,
                    Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
        } else {
            // No explanation needed, we can request the permission.
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }
    

    这里的代码大部分都很好理解,首先通过 ContextCompat.checkSelfPermission 方法判断是否拥有某个权限,然后通过 ActivityCompat.shouldShowRequestPermissionRationale 方法判断是否需要显示请求权限解释,最后通过 ActivityCompat.requestPermissions 方法显示权限对话框让用户选择是否允许使用该权限。
    这里 ActivityCompat.shouldShowRequestPermissionRationale 方法一开始我是比较疑惑的,经过查资料和实际操作发现有以下几种情况:

    • 当首次询问用户是否允许权限时,返回 false
    • 当用户拒绝过一次权限时,返回 true ,此时需要解释该权限的作用;
    • 当用户选择不再显示该对话框,并拒绝时,返回 false ,同时对话框也不再显示。

    回调处理

    接下来需要处理用户选择的结果,activity通过实现 ActivityCompat.OnRequestPermissionsResultCallback 接口,重写 onRequestPermissionsResult 方法。

    @Override
    public void onRequestPermissionsResult(int requestCode,
            String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
    

    这里写一下在实际使用过程中我遇到的坑,在 Google 的教程是适用于 activity 的,在 fragment 中使用时,我发现上述方法并没有得到回调,解决方法是在 fragment 中直接使用 fragment 的 requestPermissions 方法取代 ActivityCompat.requestPermissions 来显示对话框,并重写 fragment 中的 onRequestPermissionsResult 方法,其他与上述一致。值得注意的是,只要调用了 requestPermission 之后,不论用户是允许,拒绝还是不在显示,该方法都会被回调。
    内容很简单,只要是讲了使用中遇到的一些问题,在以后可能使用中可以得到避免,毕竟 6.0 的占有率会一直上升,6.0 权限的适配是需要做的。
    危险权限的列表和分组,还有完整的官方demo都在参考链接中。

    参考链接:

    Dangerous permissions and permission groups
    Google sample

    相关文章

      网友评论

        本文标题:Android 6.0 权限申请

        本文链接:https://www.haomeiwen.com/subject/lawhsttx.html