Android6.0权限申请示例

Android6.0权限申请示例

从Android6.0开始,系统在权限上做了大幅度的改变,6.0之前只要在AndroidManifest.xml文件中声明使用相关的权限就可以了,在安装的时候将会提示用户授权,如果用户不授权就无法安装。6.0之后则不同,安装apk时不会提示用户授权,而是将所有权限都默认为拒绝,只有要应用到某项权限时,才会询问用户是否授权。此时如果我们的老代码不做任何变动的话App就会因为没有权限而崩溃,所以当我们的App要应用6.0的这个特性的时候就要在代码中检查一下是否有某项操作所需要的权限,如果没有就要提醒用户开通权限。

一、权限级别:

Android系统权限分为几个保护级别。常用的两个最重要保护级别是正常权限危险权限:

1、正常权限:

涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。这些权限在应用安装时授予,运行时不再询问用户。例如: 网络访问、WIFI状态、音量设置等。完整的正常权限列表参考官网 正常权限。

2、危险权限:

涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如: 拨打电话、读取通讯录、读写存储器数据、获取用户位置等。如果应用声明需要这些危险权限,则必须在运行时明确告诉用户,让用户手动授予。

二、如何请求权限?

当设备系统是 Android 6.0 (API 23) 或更高版本,并且应用的 targetSdkVersion 是 23 或更高版本时,则针对在 AndroidManifest.xml 中声明的危险权限,在运行时还需要动态请求用户授权,否则会崩溃。具体的操作步骤分为以下几步:

1、先检查是否有权限

/**
 * 判断是否有某个权限
 *
 * @param permission
 * @return
 */
private boolean hasPermission(@NonNull String permission) {
    return ContextCompat.checkSelfPermission(this, permission)
        == PackageManager.PERMISSION_GRANTED;
}

2、如果没有权限,则请求权限

/**
 * 申请权限
 *
 * @param permissions
 */
private void requestPermissions(@NonNull String[] permissions) {
    ActivityCompat.requestPermissions(this, permissions, 1);
}

请求后将会弹框询问用户是否允许某个操作,如下图所示:

注意:

权限参数传入的是数组,可以调用该方法一次请求多个权限;
传入的权限数组参数以单个具体权限为单位,但弹框询问用户授权时,属于同一权限组的权限将自动合并询问授权一次;
请求的权限必须事先在 AndroidManifest.xml 中有声明,否则调用此方法请求时,将不弹框,而是直接返回“拒绝”的结果;
第一次请求权限时,用户点击了“拒绝”,第二次再请求该权限时,对话框将出现“不再询问”复选框,如果用户勾选了“不再询问”并点击了“拒绝”,则之后再请求此权限组时将不弹框,而是直接返回“拒绝”的结果。

3、处理请求结果

重写onRequestPermissionsResult(…) 方法,在该方法中处理结果。

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    // 根据返回的申请结果进行相应处理

    // 参数说明:
    // permissions是申请的各个权限
    // grantResults是各个权限的申请结果,与permisssions一一对应
    // 如果申请了多个权限,要注意区分每个权限的申请结果
    // 这里只简单处理了一下只申请一个权限的情况
    if (requestCode == 1) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startActivity(callIntent);
        } else {
            // 此处一般要提醒用户去打开相应的权限
        }
    }
}

三、一个有趣的事

在写demo的过程中发现一个有趣的现象,调用相机是不需要申请权限的,无法哪个版本都是可以正常调用的,所以也就不必做权限判断。但如果在AndroidManifest.xml中声明了相机权限,就必须做权限判断,否则在6.0以上的机型运行就会crash,不信你试试?所以如果仅仅是调系统相机,就不要在AndroidManifest.xml中声明使用相机权限,也不必做权限判断,这样最简单省事。

最后,上源码

demo: https://github.com/MingHuang1024/AboutAPI23Permissions



由于水平有限,如果文中存在错误之处,请大家批评指正,欢迎大家一起来分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值