文档章节

简洁、易用的权限处理库——PermissionDispatcher

亭子happy
 亭子happy
发布于 2017/01/21 12:53
字数 939
阅读 654
收藏 32

    在Android 6.0以前的系统中,如果使用的功能用到相关权限,需要在AndroidManifest.xml文件中声明,在用户要安装程序的时候将其展现出来。但是,用户一般不会在意要使用的应用都需要哪些权限,也不会因为需要这些权限而不安装应用。所以一般在安装的时候,就将所有权限都一并申请了。

    Android 6.0系统在权限管理上增加了动态权限的控制。它将权限分为两种,一种是静态权限,一种是动态权限。对于一般权限,和以前一样,在AndroidManifest.xml中申请即可,这种是静态权限。对于重要的权限,不仅要在AndroidManifest.xml文件中声明,还需要通过代码让用户在使用的时候动态申请,这种是动态权限。

    Android 6.0系统对动态权限进行了定义,说明哪些权限是动态的,必须动态申请才能使用。并且有权限组的概念,也就是说,在一个组内的权限,只要申请了一个,其他的组内权限就被全部申请了。

    动态权限组表:

    

    Android 6.0给申请动态权限开放的api,使用起来相当麻烦,包括请求权限,权限处理回调,开发者需要根据用户对系统弹出的动态权限框的各种处理进行相关操作。

    因此,有许多第三方库专门来处理这个问题,其中,个人认为PermissionDispatcher这个库非常方便、好用。

    下面就来说说如何使用PermissionDispatcher库来为应用处理动态权限。

    1、配置

    For Android Gradle Plugin >= 2.2 users,需要在app module的build.gradle文件中配置以下内容:

dependencies {
  compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
  annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
}

    其中,${latest.version} is Download 。  

    For Android Gradle Plugin < 2.2 users,需要在project的build.gradle文件中配置以下内容:

buildscript {
  dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}

    2、PermissionDispatcher是通过注解的方式来使用的。

    

    其中,

        @RuntimePermission用来标注需要申请动态权限的Activity和Fragment。

        @NeedsPermission指明需要申请权限的方法。需将申请权限成功后的执行内容放到一个方法中,然后将该注解放到该方法上,权限申请成功后,就会自动执行这个方法。

        @OnShowRationale可以弹对话框向用户解释权限。

        @OnPermissionDenied放在用户在授权对话框选择拒绝授权后,执行的方法上面。

        @OnNverAskAgain放在用户在授权对话框选择拒绝授权,并且勾选了“不在提示”选择框后,执行的方法上面。

    示例如下:

@RuntimePermissions
public class MainActivity extends AppCompatActivity {

    @NeedsPermission(Manifest.permission.CAMERA)
    void showCamera() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
                .addToBackStack("camera")
                .commitAllowingStateLoss();
    }

    @OnShowRationale(Manifest.permission.CAMERA)
    void showRationaleForCamera(final PermissionRequest request) {
        request.proceed();
    }

    @OnPermissionDenied(Manifest.permission.CAMERA)
    void showDeniedForCamera() {
        Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();
    }

    @OnNeverAskAgain(Manifest.permission.CAMERA)
    void showNeverAskForCamera() {
        Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();
    }
}

    2、使用PermissionDispatcher库产生的类

    在编写完上面示例程序后,编译运行,会产生一些类,我们需要使用这些类进行权限申请。产生的类在app/build/intermediates/classes/debug/包名 目录下。

    其中,XXXPermissionDispatcher.XXXWithCheck(this, args...)这条语句就是申请权限。args是@NeedPermission标注的方法的参数。

    并且,需要在onRequestPermissionsResult回调方法中执行

XXXPermissionDispatcher.onRequestPermissionsResult方法。

    示例如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button_camera).setOnClickListener(v -> {
      // NOTE: delegate the permission handling to generated method
      MainActivityPermissionsDispatcher.showCameraWithCheck(this);
    });
    findViewById(R.id.button_contacts).setOnClickListener(v -> {
      // NOTE: delegate the permission handling to generated method
      MainActivityPermissionsDispatcher.showContactsWithCheck(this);
    });
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // NOTE: delegate the permission handling to generated method
    MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}

 

本文出自 亭子happy,转载时请注明出处及相应链接

https://my.oschina.net/tingzi/blog/828806

习惯使用手机的朋友们可以关注我的微信公众号看文章。

© 著作权归作者所有

亭子happy
粉丝 119
博文 234
码字总数 46492
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

f
fanll
您好 我想要一份dome 我的邮箱是 fanjialiang1314@qq.com
Android 学习资料汇总

1.Android跳转到通讯录获取用户名称和手机号码(http://blog.csdn.net/aiguoguo000/article/details/51580653) 2.基于高德地图Android API快速搭建用车解决方案的示例(https://github.com/ama...

IT追寻者
2016/11/24
10
0
快快快!27个提升效率的iOS开源库推荐

我热爱开源,更喜爱那些花费宝贵的业余时间来创造奇迹的开发者们,感谢他们将自己辛苦劳动的成果无偿分享给大家。开源作者和贡献者们,你们太了不起了,感谢你们所付出的一切。 鉴于我是收集...

Snaiper
2015/12/03
51
0
手游渠道 SDK 统一接入框架--TypeSDK

TypeSDK是一个开源的统一手游渠道SDK接入框架,拥有80个海内外渠道,具备简单接入、快速出包、运营工具、分权限管理、产品数据打点等功能。实施周版本更新制度,确保每个每个使用者直接下载就...

TypeSDK
2016/11/10
898
0
利用Database2Sharp生成的EnterpriseLibrary架构的特点

框架的主要特点: 1)基于N层架构分层思想,各层边界清晰,可维护性更好。 2)基于最为广泛接受的RBAC(Role Based Access Control )的权限模型,控制更强、更合理。 3)遵循省移动公司统一UI样...

walb呀
2017/12/04
0
0
12 个基于 Rails 框架开发的 CMS 系统

Ruby on Rails 是一个用于开发数据库驱动的网络应用程序的完整框架。Rails基于MVC(模型- 视图- 控制器)设计模式。从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的模型,R...

红薯
2011/11/02
4.4K
6

没有更多内容

加载失败,请刷新页面

加载更多

Linux修改时区的正确方法【修改时间,需要修改软连接,靠谱】

CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件 [root@centos7 ~]# ll /etc/localtime lrwxrwxrwx 1 root root 33 Oct 12 11:01 /etc/loca......

Airship
29分钟前
0
0
《Netkiller Spring Cloud 手札》之 Master / Slave 主从数据库数据源配置

5.19.1. Master / Slave 主从数据库数据源配置 5.19.1.1. application.properties spring.datasource.master.driverClassName = com.mysql.cj.jdbc.Driverspring.datasource.master.url=j......

netkiller-
33分钟前
36
0
大数据(hadoop-HDFS的本地开发环境的配置与常见的HDFS的JAVA API)

HDFS的本地开发环境搭建 1:所需工具 1)hadoop2.7.3安装包 2)hadoop-eclipse-plugin插件 https://github.com/winghc/hadoop2x-eclipse-plugin 2:搭建过程 1:解压hadoop2.7.3文件2:下载...

这很耳东先生
44分钟前
1
0
TCP协议的定义和丢包时的重传机制

TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,...

tantexian
44分钟前
2
0
图解Tomcat类加载机制(阿里面试题)

Tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双...

群星纪元
50分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部