Android权限管理(PermissionsDispatcher框架使用)

  • 简述
    • 一、Android权限
    • 二、6.0以上权限管理

简述

由于对于安全考虑,Android对于权限的管理更加的严谨,以6.0位界分为两种处理方式:6.0以下系统还是保持旧的处理方式,直接在AndroidManifest清单中注册相应权限就可以;6.0以上系统就需要根据权限的等级(普通权限和危险权限)进行权限注册,如果是普通权限还是依照之前的处理方式直接在AndroidManifest清单中注册即可,但是危险权限不仅需要在AndroidManifest清单中注册且还需要在使用时动态申请
其实现在主流权限管理框架有三个,分别为PermissionsDispatcher、RxPermissions和easypermissions;在使用中作者方向从代码简洁及易用性来说PermissionsDispatcher跟优于其他两种两种框架;PermissionsDispatcher是采用注解的方式进行权限管理,RxPermissions是基于RxJava的权限管理,easypermissions是谷歌推出的;有兴趣的朋友加深去了解一下;但不管怎么样这三个框架都简化了需要动态管理的权限。

一、Android权限


terminal中使用这个命令可以列出调试手机的所有权限,包含应用自定义的权限:

adb shell pm list permissions

注意:并不是所有的危险权限都能申请,有某些权限系统是默认禁止的,目前暂时没有任何办法获取

二、6.0以上权限管理

在介绍该PermissionsDispatcher框架前我简述一下,官方或网上给出的很多注册方式都没问题的,但是对于Android本身的问题(千奇百怪手机,不同品牌对于系统再次定制),有时总会出现由于考虑不周总会出现这样那样的问题会让你焦头烂额的,我也是经过多种尝试,最终觉的还是这个框架还是目前来说最稳定的管理方式;
介绍:PermissionsDispatcher是一个基于注解、帮助开发者简单处理Android 6.0系统中的运行时权限的开源库、避免开发者编写大量繁琐的样板代码并进行了简化处理。
开源地址:https://github.com/hotchemi/PermissionsDispatcher
文档介绍:http://hotchemi.github.io/PermissionsDispatcher/
下面开始介绍如何在Android studio使用该框架:

1、添加依赖
在项目工程下的build.gradle文件中加入对maven仓库依赖引入的支持

allprojects {    repositories {        jcenter()        mavenCentral()    }}

之后在module下的build.gradle文件中添加两项依赖:

implementation 'com.github.hotchemi:permissionsdispatcher:2.3.1'annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.1'

并将targetSdkVersion设为23(一定要大于等于23),即:targetSdkVersion 23
2、在Plugins加入PermissionsDispatcher插件
在Android studio加入PermissionsDispatcher插件有益于你后期快速使用PermissionsDispatcher,可以说几乎于是一键导入;
第一步在AS File点击Setting进入Setting操作面板

第二部,在Setting操作面板选择Plugins,在右上角输入框中输入PermissionsDispatcher搜索,并安装,安装后需要重启

3、在工程中使用PermissionsDispatcher插件开始布局Permissions管理
注意:在使用权限管理框架前,一定要明确一点,一定要Activity/Fragment中使用
第一步:在需要使用权限管理的Activity/Fragment类中右击如下图,选择Generate -> Generate Runtime Permissions…
第二步:如下图,在权限管理区域选择相应的权限
然后在Annotations区域,选择相应的注解,选择的注解同时需要自定义对应的方法名;
最后点击“Generate”按钮;最好强调移一下点击“Generate”后会有个弹窗,可以选择rebuild,也可以不用,但一定要在生成的方法前使用public,且再次将工程build-》rebuild project一下,结果如下图:

以下为注解说明(注:带注释的方法一定不能private,一定要为public):

注解 是否必须要 描述
@RuntimePermissions 在Activity的Class声明此注解,来处理我们的权限
@NeedsPermission 请求的权限成功后执行的方法
@OnShowRationale 在申请权限前解释为什么需要这些权限
@OnPermissionDenied 当用户拒绝授权时将调用该方法
@OnNeverAskAgain 当用户选择了 “不再提醒” 将调用该方法

a、@RuntimePermissions注解:这是必须使用的注解,用于标注在你想要申请权限的Activity或者Fragment上

@RuntimePermissionspublic class TestActivity extends UMengBaseActivity {

b、@NeedsPermission注解:这也是必须使用的注解,用于标注在你要获取权限的方法,注解括号里面有参数,传入想要申请的权限。也就是说你获取了相应的权限成功后就会执行这个方法

@NeedsPermission(Manifest.permission.CAMERA)public void NeedsMethod() {}

c、@OnShowRationale注解:这个不是必须的注解,用于标注申请权限前需要执行的方法,注解
括号里面有参数,传入想要申请的权限,而且这个方法还要传入一个PermissionRequest对象,这个对象有两种方法:proceed()让权限请求继续,cancel()让请求中断。也就是说,这个方法会拦截你发出的请求,这个方法用于告诉用户你接下来申请的权限是干嘛的,说服用户给你权限

@OnShowRationale(Manifest.permission.CAMERA)public void RationaleMethod(final PermissionRequest request) {}

d、@OnPermissionDenied注解:这个也不是必须的注解,用于标注如果权限请求失败,但是用户没有勾选不再询问的时候执行的方法,注解括号里面有参数,传入想要申请的权限。也就是说,我们可以在这个方法做申请权限失败之后的处理,如像用户解释为什么要申请,或者重新申请操作等

@OnPermissionDenied(Manifest.permission.CAMERA)public void DeniedMethod() { }

e、@OnNeverAskAgain注解:这个也不是必须的注解,用于标注如果权限请求失败,而且用户勾选不再询问的时候执行的方法,注解括号里面有参数,传入想要申请的权限。也就是说,我们可以在这个方法做申请权限失败并选择不再询问之后的处理。例如,可以告诉作者想开启权限的就从手机设置里面开启

@OnNeverAskAgain(Manifest.permission.CAMERA)public void AskMethod() {}

为什么注解方法前一定要使用public:
原因是只要我们实现了@RuntimePermissions和@NeedsPermission这两个必须的注解之后,再build一次project之后,编译器就会在在app\build\intermediates\classes\debug目录下与被注解的Activity同一个包下生成一个辅助类,名称为 “被注解的Activity的名称+PermissionsDispatcher” 的辅助类,用来调用被注解的Activity的方法(就是因为这个所以被注解的方法不能private,private方法的作用域不在其他的类)。所以,第一次用的话,要注解好之后,build一次,下面的方法里面的PermissionsDispatcherActivityPermissionsDispatcher才不会令AS报红。

最后在相应的方法调用申请方法就可以了
类名:类名+PermissionsDispatcher
方法名:@NeedsPermission注解的方法名+WithCheck

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_test);    TestActivityPermissionsDispatcher.NeedsMethodWithCheck(this);//调用此方法即可动态申请权限;}

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android上一些方法的区别和用法的注意事项
  5. android实现字体闪烁动画的方法
  6. Android中dispatchDraw分析
  7. Android四大基本组件介绍与生命周期
  8. Android(安卓)MediaPlayer 常用方法介绍
  9. 在Fragment中设置控件点击方法,执行失败。

随机推荐

  1. Android的多媒体(Media Sever Framework )
  2. Android Studio上非常棒的插件
  3. Android 热敏打印机打印二维码
  4. 《Android移动应用基础教程》(Android Stu
  5. Android(安卓)版本兼容 — Android(安卓)
  6. Android kotlin学习之----kotlin+recycle
  7. 面向UDP的Android——PC双向通信(一):实现An
  8. Android基础入门教程——2.6 菜单(Menu)
  9. Android攻城狮面试指南
  10. Android应用程序键盘(Keyboard)消息处理机