Android 6.0的权限问题

今天一个客户打电话到公司来说他的s7手机安装我们的软件出现闪退的情况,s7又是6.0的手机,所以特意用genymotion下载了6.0的模拟器测试,才发现,google在6.0中把ManiFest中授与权限的部分改了,从以前的安装时授权所有权限,提示危险权限,改成了现在的所有危险权限全部run time时获取。

故此找寻了一下相关的解决办法,结合官方文档,写下此解决过程,为遇到难题的小伙伴解决问题,也为自己做个记录。

由于第一次写博客,有描述不清楚,或写的不好的地方,希望大家多多见谅。

这里写图片描述

上图可以看到官方的描述,系统权限划分成了两块,普通权限与危险权限。

这里写图片描述

上图中说明了解决6.0未授权闪退问题的办法之一是把你的目标SDK版本修改至22或以下,不好的地方就是你无法使用23的特性。

如果想快速解决的朋友可以采取这种方式:将build.gradle里targetSdkVersion 改成22或以下即可

当然,作为有追求的程序员,我们还是要找到既能使用23特性又能完美授权的方案的。

就不废话了,直接上代码

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 判断版本是否是6.0或以上
            // 首先检查用户权限
    int i = checkSelfPermission(Manifest.permission.READ_PHONE_STATE);
    if (i == PackageManager.PERMISSION_GRANTED) {
                initData();// 原本需要权限才能执行的代码
    } else {
                // 向用户提起授权--> 会弹出对应的授权对话框
      requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    }
} else{
    // 如果是6.0以下,会在安装应用的时候提示授权,所以可以直接执行代码
    initData();
}

    // 请求回调 可以请求多个权限,用requestCode来分辨
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode){
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS:
                if (grantResults.length > 0
                        // PERMISSION_GRANTED 为已授权  PERMISSION_DENIED 拒绝授权
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    initData();
                } else {
                    // 不授权则不能用,结束当前活动(或者其他提示用户没权限的逻辑)
                    ShowActivity.this.finish();
                }
                break;


        }
    }

程序因为会兼容低版本,所以需要先判断当前版本。MY_PERMISSIONS_REQUEST_READ_CONTACTS 是一个自定义的常量,用来标识你请求的权限,在后面的请求权限回调中用到了。其他的注释应该写清楚了吧。

这样就完成了危险权限的授权啦!如果要更友善的话,可以用其他提示方法在请求授权之前告知用户你为什么需要权限。

英语好的同学,可以直接查看官方文档。
Android官方文档–运行时请求权限(需科学上网)

如果还有疑问,可以在博客下方留言。

发布了1 篇原创文章 · 获赞 0 · 访问量 2527
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览