以下文章为自己在项目中集成运行时权限的整理心得,这是我写的第一篇博客,代码部分全部为截图形式
仅供学习参考
1.在AndroidManifest文件中添加需要的权限(权限申明)。
2.检查权限
2.1 android studio权限检查智能提示
注:不要太依赖于权限智能提示(上图只供参考),有些权限并不会提示(如sms,SDcard权限等)。
2.2 检查权限代码
当要对危险权限进行操作时,都要检查权限是否已经申请,代码如下
注:Activity与Fragment中检测权限方法相同:
这里涉及到一个API,ContextCompat.checkSelfPermission (API 23 v4包兼容库,完美兼容所有版本),
主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。
3.申请授权
注:Activity与Fragment中检测权限方法不相同:
3.1 Activity中申请权限
该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。
3.2 Fragment中申请权限
在Fragment中申请权限,不要使用ActivityCompat.requestPermissions, 直接使用requestPermissions方法。
3.3 一次性申请多个权限(以Fragment为例)
可以从方法名requestPermissions中参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权,同时申请多个权限方法参考如下(同时访问camera和SD卡写权限):
4.处理权限申请回调
4.1 单个权限申请回调处理
对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。
4.2 多个权限申请回调处理(同时申请camera和SD卡写权限)
5.在回调中给出的提醒
在用户拒绝权限时,分两种情况:
1.用户拒绝时未勾选不再提示----->用户再次申请权限时,还会弹出权限申请弹框。
2.用户拒绝时勾选不再提示----->用户再次申请权限时,程序什么都不会做(程序默认拒绝权限),此时要给用户一个提醒。
5.1 给出Toast提示
shouldShowRequestPermissionRationale这个API主要用于给用户一个申请权限的解释,该方法只有在用户在上一次已经拒绝过你的这个权限申请。如果这个选项在拒绝授权前被用户勾选了。下次为这个权限请求requestPermissions时,对话框就不弹出来了,结果就是,app啥都不干。这将是很差的用户体验,用户做了操作却得不到响应。这种情况需要好好处理一下。
5.2 给出对话框提醒
6.Fragment中嵌套Fragment申请权限注意点
如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult 不会回调回来,建议使用 getParentFragment().requestPermissions方法,这个方法会回调到父Fragment中的onRequestPermissionsResult。
例子:子Fragment(InnerFragment1)要在父Fragment(FatherFragment1)申请发送短信权限
1.InnerFragment1申请SEND_SMS权限
2.FatherFragment1回调给InnerFragment1
3.InnerFragment1回调处理
7.自定义权限
7.1 自定义权限使用场景
应用程序B中的BActivity允许其他应用程序打开,应用程序A可以通过隐式意图打开BActivity。
若B中的BActivity想加上一些访问限制-----此时可以采用自定义权限
7.2自定义权限使用步骤(Normally权限)
1.在应用程序B的清单文件中进行自定义权限申明
android:name :权限的唯一标识,一般都是使用 报名加权限名(必须有)
android:description :对权限的描述,需要写在@String里。(可默认)
android:label: 对权限的一个简短描述(可默认)
android:permissionGroup: 权限所属权限组的名称(可默认)
android:protectionLevel: 权限的等级(必须有)
效果图:
2.在应用程序B中的BActivity进行权限注册
一定要为Activity中的属性android:exported设置值为true,以表示可以被其他应用程序打开;
或者,也可以为Activity设置一个action android:name属性。
3.在应用程序A的清单文件中进行权限申明
4.1在应用程序A中隐式意图调用B中的BActivity(Normally权限)
4.2在应用程序A中隐式意图调用B中的BActivity(Dangerous权限)
4.2.1Dangerous权限需要检测、申请
4.2.2权限申请回调处理