Android – 6.0 动态权限
前言
很早就知道Android 6.0新功能动态权限申请,但是一直没接触过,因为特殊权限也没怎么用过。但是最近看到好多文章阐述,一时技痒,就搞搞看。做过之后才知道,掌握这个知识点还是很有必要的,因为在Android 6.0 以上的设备上,一些特殊权限必须是在运行时动态赋予给用户的。如果直接Intent跳转的话,应用直接Crash了。
申请步骤
- targetSdkVersion >= 32
- AndroidManifest.xml中申请需要的权限,包括普通权限和特殊权限
- 开始动态申请权限
(1):检查是否有此权限 ContextCompat.checkSelfPermission(),返回整形,和PackageManager.PERMISSION_GRANTED对比,相等则说明有此权限,如果有此权限,完全OK
(2):没有此权限,则判断是否需要向用户解释为何申请权限 shouldShowRequestPermissionRationale() ,然后通过ActivityCompat.requestPermissions()方法申请权限,该方法有三个参数,即当前Activity,要申请的权限(字符串数组),requestCode。这样就可以知道一次可以申请多个权限,而requestCode就是用来在第三部回调的时候判断是谁申请了权限。
(3):在当前Activity中的onRequestPermissionsResult()方法中处理用户是否授予了此权限。
坑
- 在小米5上测试的时候,发现当用户拒绝了权限,之后在点击就不会在弹出提示框,而在原生的Android系统中,拒绝一次之后再次点击,第二次弹出申请权限的对话框中会出现”以后不再弹出“的复选框。参考网上一个比较好的做法是,在再次点击的时候打开当前应用的信息界面,让用户可以手动来赋予权限。代码如下:
|
|
- 测试了两个权限,一个是打开相册权限,一个是拨打电话权限,在点击提示框赋予权限之后,可以直接跳转的系统相册界面,但是在赋予通话权限之后,还需要再次点击才能进去通话界面,主要是通电话的Intent不能写入到onRequestPermissionsResult()方法中,提示“ Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or explicitly handle a potential SecurityException “,这不是开玩笑吗?留个坑吧,待解决。
Demo 地址:
https://github.com/Omooo/DynPermissionsDemo
参考
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1110/3670.html