Android M动态获取权限示例

来源:互联网 发布:数据存储 编辑:程序博客网 时间:2024/06/07 05:00

Android M推出了不少新功能,其中我比较关注的是新的权限机制,应用的权限不再是在应用安装时一次性赋予,而是需要在运行时询问用户,经过同意之后才能使用对应的权限.

希望这样的生态能够改善android app乱要权限的现状,进而改进android生态.

扯远了, 事实上本文仅就应用中如何实现动态获取权限给出一个简单示例,参考的是Google提供的相关sample

首先给出效果图

   

区别在申请超过一项权限时,左下角会有显示权限数量,对话框依次显示.


实现以上功能, 需要以下几个步骤

  1. 注册权限:  在AndroidManifest.xml中,添加需要动态申请的权限,和之前不同的是多了-sdk-m,代表仅对SDK版本高于M的才有用,在较低系统版本的机器上运行时,app是无法获得这两项权限的.

<span style="white-space:pre"></span> <uses-permission<span style="color:#ff6666;">-</span><span style="color:#ff0000;">sdk-m</span> android:name="android.permission.READ_CONTACTS" />         <uses-permission<span style="color:#ff0000;">-sdk-m</span> android:name="android.permission.CAMERA" />

2. 校验/申请权限:  在代码中需要用到权限前,先判断是否具有该权限,如果尚未被赋予该权限,则需要进行申请,

    private void onClickShowContact() {        if (<span style="color:#ff0000;">hasPermission</span>(Manifest.permission.READ_CONTACTS)) {            showContact();        }        else {            <span style="color:#ff0000;">requestPermissions</span>(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CONTACTS);        }    }    private boolean hasPermission(String permission) {        if (!Build.VERSION.CODENAME.equals("MNC")) {//如果设备的系统不是android M预览版            return true;        }        return checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;    }
requestPermissions是Activity.class中的方法,

第一个参数是想要申请的权限,数组类型,可以一次性传多个权限,让用户线性地进行授权. 

第二个是request代号,类似startActivityResult时传的requestCode,主要用于在回调时进行区分.

调用后,就会显示出上面那样的授权界面.


3. 处理权限赋予结果的回调:

    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        switch (requestCode) {            case REQUEST_CONTACTS:                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    showContact();                }                break;            default:                break;        }    }

这里的处理也和onActivityResult的处理非常相似,根据requestCode判断请求的权限类型.  permissions和grantResult是一一对应的,当用户对某一权限同意授权后,对应index的grantResults中的元素的值即为PackageManager.PERMISSION_GRANTED.


可以看出动态获取权限还是非常简单的,只是一个应用要在权限使用上适配到完全兼容M,需要修改的地方可能会比较多.

另外,展示给用户看的权限粒度并没有很细,目前只是大致地分为几大类,不至于让用户太困惑.

最后再贴几张与Android M中与权限相关的截图.

权限类型



针对某项权限,对申请了该项权限的应用进行重新配置




针对某项应用,对其权限进行重新配置



应用高级选项


0 0