PermissionsDispatcher2.3.2使用

Android6.0权限官网
https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html?hl=zh-cn
系统权限:
https://developer.android.com/training/permissions/index.html?hl=zh-cn
权限的最佳做法:
https://developer.android.com/training/permissions/best-practices.html?hl=zh-cn#testing
该库的github地址
https://github.com/hotchemi/PermissionsDispatcher

权限

Gradle配置

使用PermissionsDispatcher,需要在project的 build.gradle中添加


(1)当Studio的版本在2.2之上

在app module中的build.gradle中添加:

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

目前${latest.version}
最新的是2.3.2。


(2)当Studio的版低于2.2

在工程目录下build.gradle 文件中添加:

  1. buildscript {
  2. dependencies {
  3. classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  4. }
  5. }

然后在app module中的build.gradle中添加:(必须在app module中添加)

  1. apply plugin: 'android-apt'
  2. dependencies {
  3. compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
  4. apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
  5. }

用法:

1.注解

PermissionsDispatcher只介绍几个注解,保持其通用API简洁:

注:带注释的方法一定不能private。

注解 需要 描述
@RuntimePermissions 在Activity或者Fragment中需要添加,来处理权限的问题
@NeedsPermission 注释其执行需要一个或多个许可的作用的方法(当用户授予了权限之后,会调用使用此注解的方法)
@OnShowRationale   注释这解释了为什么需要许可/秒/方法。它通过在一个PermissionRequest可用于继续或中止在用户输入的当前的许可请求对象
@OnPermissionDenied   注释这是调用的方法,如果用户不授予的权限
@OnNeverAskAgain   注释如果用户选择让设备“不再询问”有关许可被调用的方法

具体使用如下:

  1. @RuntimePermissions
  2. public class MainActivity extends AppCompatActivity {
  3. @NeedsPermission(Manifest.permission.CAMERA)
  4. void showCamera() {
  5. getSupportFragmentManager().beginTransaction()
  6. .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
  7. .addToBackStack("camera")
  8. .commitAllowingStateLoss();
  9. }
  10. @OnShowRationale(Manifest.permission.CAMERA)
  11. void showRationaleForCamera(final PermissionRequest request) {
  12. new AlertDialog.Builder(this)
  13. .setMessage(R.string.permission_camera_rationale)
  14. .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())
  15. .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())
  16. .show();
  17. }
  18. @OnPermissionDenied(Manifest.permission.CAMERA)
  19. void showDeniedForCamera() {
  20. Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();
  21. }
  22. @OnNeverAskAgain(Manifest.permission.CAMERA)
  23. void showNeverAskForCamera() {
  24. Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();
  25. }
  26. }

2.自动生成的类

Activity继承了AppCompatActivity,是的,如果使用PermissionsDispatcher进行权限管理,那么Activity就要继承AppCompatActivity。这就要使用到了兼容包里的类了。同样此时相应Activity中使用的主题,也需要进行修改,修改成相应兼容包里的主题。
在编译时,PermissionsDispatcher产生的一类MainActivityPermissionsDispatcher([活动名称] + PermissionsDispatcher),您可以使用安全地访问这些许可保护的方法。

MainActivityPermissionsDispatcher需要自己编译才会有:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. findViewById(R.id.button_camera).setOnClickListener(v -> {
  6. // NOTE: delegate the permission handling to generated method
  7. MainActivityPermissionsDispatcher.showCameraWithCheck(this);
  8. });
  9. findViewById(R.id.button_contacts).setOnClickListener(v -> {
  10. // NOTE: delegate the permission handling to generated method
  11. MainActivityPermissionsDispatcher.showContactsWithCheck(this);
  12. });
  13. }
  14. @Override
  15. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  16. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  17. // NOTE: delegate the permission handling to generated method
  18. MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
  19. }

添加SDK支持版本的两种方式:

  • 1、AndroidManifest

    1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
  • 2、在注解的时候添加sdk版本控制
  1. @RuntimePermissions
  2. public class MainActivity extends AppCompatActivity {
  3. @NeedsPermission(value = Manifest.permission.WRITE_EXTERNAL_STORAGE, maxSdkVersion = 18)
  4. void getStorage() {
  5. // ...
  6. }
  7. }

使用步骤:

一、在Manifest中添加权限
  1. <uses-permission android:name="android.permission.CAMERA" />
二、在Activity中添加注解
  1. @RuntimePermissions
  2. public class MainActivity extends AppCompatActivity {
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. ButterKnife.bind(this);
  8. }
  9. /**
  10. * 显示相机权限
  11. */
  12. @NeedsPermission(Manifest.permission.CAMERA)
  13. void showCamera() {//处理当用户允许该权限时需要处理的方法
  14. getSupportFragmentManager().beginTransaction()
  15. .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
  16. .addToBackStack("camera")
  17. .commitAllowingStateLoss();
  18. }
  19. @OnShowRationale(Manifest.permission.CAMERA)
  20. void showRationaleForCamera(final PermissionRequest request) {// 提示用户权限使用的对话框
  21. new AlertDialog
  22. .Builder(this)
  23. .setMessage("是否打开权限")
  24. .setPositiveButton("允许", new DialogInterface.OnClickListener() {
  25. @Override
  26. public void onClick(DialogInterface dialog, int which) {
  27. request.proceed();
  28. }
  29. })
  30. .setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
  31. @Override
  32. public void onClick(DialogInterface dialog, int which) {
  33. request.cancel();
  34. }
  35. })
  36. .show();
  37. }
  38. /**
  39. * 如果用户拒绝该权限执行的方法
  40. */
  41. @OnPermissionDenied(Manifest.permission.CAMERA)
  42. void showDeniedForCamera() {
  43. Toast.makeText(this, "获取权限失败", Toast.LENGTH_SHORT).show();
  44. }
  45. @OnNeverAskAgain(Manifest.permission.CAMERA)
  46. void showNeverAskForCamera() {
  47. Toast.makeText(this, "再次获取权限", Toast.LENGTH_SHORT).show();
  48. }
三、重写回调方法,并且使用MainActivityPermissionsDispatcher(此方法编译生成【Activity】+PermissionsDispatcher)
  1. /**
  2. * 权限请求回调,提示用户之后,用户点击“允许”或者“拒绝”之后调用此方法
  3. *
  4. * @param requestCode 定义的权限编码
  5. * @param permissions 权限名称
  6. * @param grantResults 允许/拒绝
  7. */
  8. @Override
  9. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  10. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  11. MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
  12. }
  13. @OnClick({R.id.button_camera, R.id.button_contacts})
  14. public void onClick(View view) {
  15. switch (view.getId()) {
  16. case R.id.button_camera:
  17. // show(this, "相机");
  18. // 默认是没有此类的,需要编译下才会有此类
  19. MainActivityPermissionsDispatcher.showCameraWithCheck(this);
  20. break;
  21. }
  22. }

注意

  • 使用到的权限需要在Mnifest里面注册
  • PermissionsDispatcher依赖于support-v4由默认库,以便能够使用一些权限compat的类。
  • 需要添加support-v13库一起PermissionsDispatcher在您的项目,它将使原生片段支持





原生6.0权限使用

Android 6.0 变更

另请参阅
Android 6.0 API 概览

Android 6.0(API 级别 23)除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。
如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。

运行时权限

此版本引入了一种新的权限模式,如今,用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
对于以 Android 6.0(API 级别 23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限。要确定您的应用是否已被授予权限,请调用新增的 checkSelfPermission()
方法。要请求权限,请调用新增的 requestPermissions()
方法。即使您的应用并不以 Android 6.0(API 级别 23)为目标平台,您也应该在新权限模式下测试您的应用。

使用步骤

1、在AndroidManifest文件中添加需要的权限。

这个步骤和我们之前的开发并没有什么变化,试图去申请一个没有声明的权限可能会导致程序崩溃。

2、检查权限
  1. if (ContextCompat.checkSelfPermission(this,
  2. Manifest.permission.READ_CONTACTS)
  3. != PackageManager.PERMISSION_GRANTED) {
  4. }else{
  5. //
  6. }

这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

3、申请授权
  1. ActivityCompat.requestPermissions(this,
  2. new String[]{Manifest.permission.READ_CONTACTS},
  3. MY_PERMISSIONS_REQUEST_READ_CONTACTS);

该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。

4、处理权限申请回调
  1. @Override
  2. public void onRequestPermissionsResult(int requestCode,
  3. String permissions[], int[] grantResults) {
  4. switch (requestCode) {
  5. case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
  6. // If request is cancelled, the result arrays are empty.
  7. if (grantResults.length > 0
  8. && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  9. // permission was granted, yay! Do the
  10. // contacts-related task you need to do.
  11. } else {
  12. // permission denied, boo! Disable the
  13. // functionality that depends on this permission.
  14. }
  15. return;
  16. }
  17. }
  18. }

首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了~

具体使用详见demo,GitHub:https://github.com/huangshuyuan/PermissionsDispatcherDemo

参考文档:http://blog.csdn.net/lmj623565791/article/details/50709663

作者:流水潺湲
链接:http://www.jianshu.com/p/d299f22dfbdb
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

补充

现在网上不少关于权限的库,可以直接用的,在GitHub上搜索即可
https://github.com/search?o=desc&q=android+permission&s=stars&type=Repositories&utf8=%E2%9C%93

Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)    ...

  2. 用最基本的EF+MVC+JQ+AJAX+bootstrap实现权限管理的简单实例 之登陆和操作权限

    先来一堆关于上篇文章的废话(不喜者点此隐藏) 今天把博客加了个小功能,就是点标题可以隐藏或展示相关内容,做法很傻,就是引用了bootstrap的两个css类和全部的js文件,其实这样的小功能完全应该自 ...

  3. linux 权限管理命令chmod、文件和目录的权限的意义

    chmod /bin/chmod chmod [{ugoa}{+-=}{rwx}] [文件或目录]chmod [mode=421] [文件或目录]-R 递归修改 只有 root 和 所有者 可以修改一 ...

  4. Android6.0权限管理以及使用权限该注意的地方

    Android 6.0 Marshmallow首次增加了执行时权限管理,这对用户来说,能够更好的了解.控 制 app 涉及到的权限.然而对开发人员来说却是一件比較蛋疼的事情.须要兼容适配,并保证程序功 ...

  5. mysql权限管理

    经常遇到有网友在QQ群或者论坛上问关于mysql权限的问题,今天抽空总结一下关于这几年使用MYSQL的时候关于MYSQL数据库的权限管理的经验,也希望能对使用mysql的网友有所帮助! 一.MYSQL ...

  6. 第3章 Linux常用命令(2)_权限管理命令

    2. 权限管理命令 2.1 改变文件或目录权限:chmod (1)chmod命令 命令名称 chmod(change the permission mode of a file) 命令所在路径 /bi ...

  7. MVC之权限管理-网站开发之路

    一.前言 刚到公司没多长时间就开始接触MVC到现在不能说懂了,只能说到达会用这个层次吧,感觉MVC用来写Web还是很强大的,层次清晰. 今天我来写写关于权限管理这一块,自我感觉网站的权限主要分为菜单权 ...

  8. [转]java web简单权限管理设计

    原文地址:http://blog.csdn.net/zwx19921215/article/details/44467099 最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery eas ...

  9. RDIFramework.NET ━ 9.9 角色权限管理 ━ Web部分

    RDIFramework.NET ━ .NET快速信息化系统开发框架 9.9  角色权限管理 -Web部分 角色权限管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移 ...

随机推荐

  1. 最详细的vue-cli安装教程 &^没有之一 ^& 大神亲测。。╮( ̄▽  ̄)╭

    这里介绍使用git安装,电脑自带命令行依然可以使用进行安装 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装 1.2 如果本机已经安装node的运行换 ...

  2. Java拾遗补缺

    JDK9的lib目录下已经不再包含dt.jar和tool.jar.

  3. Linux信号量同步共享内存实验.

    Linux信号量同步共享内存实验. Linux信号量同步共享内存实验. 简述 程序流程 信号量和共享内存的系统函数 信号量系统函数及接口 共享内存系统函数及接口 写程序 读程序 简述 本文主要内容是自 ...

  4. Logan:美团点评的开源移动端基础日志库

    前言 Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务.同时Logan也是“金刚狼”大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀利. Logan已经 ...

  5. merge into issue

    ORA-30926: unable to get a stable set of rows in the source tables 一.经检查,这个错误是由于数据来源表(即语句中,using后面的f ...

  6. .Net中的IO

    C#中的IO 本文环境为: Win 10 VS 2015 .net Framework 版本 4.0 File 类 File 类是一个工具类,可以用来判断文件是否存在和方便的创建文件, 读取.写入等操 ...

  7. Revit二次开发示例:CancelSave

    在Revit程序中注册文件操作事件,保存新建或打开文件的信息.当保存时,如果当前文件内容和之前的一致时,则弹出对话框提示并取消保存.对话框中有一个功能链接,点击可打开插件所在目录. #region N ...

  8. [Luogu5106]dkw的lcm

    https://minamoto.blog.luogu.org/solution-p5106 容易想到枚举质因子及其次数计算其贡献,容斥计算$\varphi(p^i)$的次方数. #include&l ...

  9. 【Python3】【贪心】hdu4296 Buildings

    题意: n个板,每个板有重量和强度w和s,还有PDV值(上面的总重量-该板的强度) 对于某种叠放方式,PDV的最大值为其代表值 求该值的最小值   考虑只有两个板的情况:a和b,很显然下面的比上面的容 ...

  10. Codeforces Round #354 (Div. 2) E. The Last Fight Between Human and AI 数学

    E. The Last Fight Between Human and AI 题目连接: http://codeforces.com/contest/676/problem/E Description ...