Android运行时权限全解

来源:互联网 发布:mysql nvl 编辑:程序博客网 时间:2024/06/15 04:21

以下文章为自己在项目中集成运行时权限的整理心得,这是我写的第一篇博客,代码部分全部为截图形式

仅供学习参考


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权限申请回调处理

 

 

 

 

原创粉丝点击