当前位置: 首页 > 编程日记 > 正文

使用PermissionsDispatcher轻松解决Android权限问题

之前也处理过6.0后的权限问题,直接处理很是麻烦。这次在github上搜到了关于权限星数最多的PermissionsDispatcher这个库,几个注释完美解决权限问题。

第一步 添加各种注释

1.@RuntimePermissions 注释在需要权限的Activity和Fragment

@RuntimePermissions
public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {

2.@NeedsPermission 注释在需要权限的方法上后面,需要传入所需的权限

 1 @NeedsPermission(Manifest.permission.RECORD_AUDIO)
 2  void startRecord(ImageView img) {
 3      long currentTime = Calendar.getInstance().getTimeInMillis();
 4      if (currentTime - lastClickTime < 500) {
 5          ShowToast("时间太短");
 6      }
 7      if (!isPress && currWord < adapter.getItemCount() - 1) {
 8          img.setImageResource(R.drawable.btn_recod_style2);
 9          isPress = true;
10          //
11          adapter.getItem(currWord).setWordColor(2);
12          adapter.notifyDataSetChanged();
13 
14          //录音
15          evalUtil2.beginRe(sentenceList.get(currWord).getEng());
16      }
17  }

3.@OnShowRationale 注释在向用户解释为什么需要这个权限的方法上。

 1 @OnShowRationale(Manifest.permission.RECORD_AUDIO)
 2  void showRationaleForRecord(final PermissionRequest request){
 3      new AlertDialog.Builder(this)
 4              .setPositiveButton("好的", new DialogInterface.OnClickListener() {
 5                  @Override
 6                  public void onClick(DialogInterface dialog, int which) {
 7                      request.proceed();
 8                  }
 9              })
10              .setNegativeButton("不给", new DialogInterface.OnClickListener() {
11                  @Override
12                  public void onClick(DialogInterface dialog, int which) {
13                      request.cancel();
14                  }
15              })
16              .setCancelable(false)
17              .setMessage("挑战需要录音权限,应用将要申请录音权限")
18              .show();
19  }

这里必须要传个PermissionRequest参数。
request.proceed(); 调出系统申请权限的弹窗会执行@NeedsPermissio对应的方法
request.cancel(); 会执行@OnPermissionDenied对应的方法
如果想直接调用系统的

4.@OnPermissionDenied 被拒绝后调用的方法

 @OnPermissionDenied(Manifest.permission.RECORD_AUDIO)void showRecordDenied(){ShowToast("拒绝录音权限将无法进行挑战");}

5.@OnNeverAskAgain 勾选了不再提示禁止后调用的方法

 1 @OnNeverAskAgain(Manifest.permission.RECORD_AUDIO)
 2  void onRecordNeverAskAgain() {
 3      new AlertDialog.Builder(this)
 4              .setPositiveButton("好的", new DialogInterface.OnClickListener() {
 5                  @Override
 6                  public void onClick(DialogInterface dialog, int which) {
 7                      // TODO: 2016/11/10 打开系统设置权限
 8                      dialog.cancel();
 9                  }
10              })
11              .setNegativeButton("取消", new DialogInterface.OnClickListener() {
12                  @Override
13                  public void onClick(DialogInterface dialog, int which) {
14                      dialog.cancel();
15                  }
16              })
17              .setCancelable(false)
18              .setMessage("您已经禁止了录音权限,是否现在去开启")
19              .show();
20  }

第二步 make project一下


这个库会自动生成[Activity Name] + PermissionsDispatcher这样的一个类。当要调用使用权限的方法的时候,不直接调用我们直接添加了@NeedsPermission的方法,而是调用这个类生成的XXXWithCheck的方法。XXX就是添加了@NeedsPermission的方法名

1 switch (event.getAction()) {
2         case MotionEvent.ACTION_DOWN:
3                 StudentChallengeActivityPermissionsDispatcher.startRecordWithCheck(StudentChallengeActivity.this,img);
4     }

最后还要复写下onRequestPermissionsResult这个方法,里面写上生成类的onRequestPermissionsResult,类似如下:

1 @Override
2     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
3         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
4         StudentChallengeActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
5     }

执行的流程

需要权限的地方执行[Activity Name]PermissionsDispatcher.XXXWithCheck()
然后调用@OnShowRationale注释的方法,方法里必传的参数PermissionRequest request

  • 执行request.proceed()调用系统申请权限的弹窗;
    如果在系统申请弹窗中勾选了不在提示并且拒绝,会调用@OnNeverAskAgain的方法
  • 执行request.cancel()会调用@OnPermissionDenied的方法

PermissionsDispatcher库的地址

https://github.com/hotchemi/PermissionsDispatcher



转载于:https://www.cnblogs.com/ganchuanpu/p/7647523.html

相关文章:

什么人适合学习web前端?怎样学好web前端开发?

web前端在IT互联网行业的发展前景是非常可观的&#xff0c;越来越多的人都在学习web前端技术&#xff0c;那么什么人适合学习web前端?怎样学好web前端开发?相信大家都想了解这些问题&#xff0c;我们来看看下面的详细介绍。 什么人适合学习web前端?怎样学好web前端开发? 一…

浏览器缓存导致FLASH资源更新问题的解决方案

在网上搜浏览器缓存问题时&#xff0c;遇上了很多问题。一是不知道应该用何种关键字搜索&#xff0c;二是一搜出来&#xff0c;就全是讲的是如何禁用浏览器缓存的方案。 作为大型点的FLASH WEBGAME来说&#xff0c;不缓存显然是不行的。总体上来说&#xff0c;我们要想达到的目…

技术图文:Python的属性装饰器详解

背景 我们在以前的一篇图文 Python基础 – Task10. 类与对象 中介绍过利用property()方法既能保护类的封装特性&#xff0c;又能让开发者可以使用“对象.属性”的方式操作类属性。 class property([fget[, fset[, fdel[, doc]]]])用于在新式类中返回属性值。 fget – 获取属…

又一个强大的PHP5.3依赖注入容器

简单的服务容器 一个简单的 php 5.3 依赖注入容器。 项目地址&#xff1a;https://github.com/godruoyi/easy-container Why 目前比较流行的 PHP 容器&#xff1a; PimpleLaravel Container其他依赖注入容器Pimple 是一个简单优秀的 php 5.3 容器&#xff0c;也是目前用得最多的…

软件测试培训:如何搭建测试环境

如何搭建测试环境?这是很多测试人员都需要了解的&#xff0c;测试是每个产品上线前必备的一个检验&#xff0c;不管是什么产品&#xff0c;做好有效的测试是对产品质量的一个负责&#xff0c;软件测试环境要考虑的就是软件在什么软硬件下能正常运行&#xff0c;什么环境下不能…

技术图文:如何爬取一个地区的气象数据(上)?

背景 架空线路主要指架空明线&#xff0c;架设在地面之上&#xff0c;是用绝缘子将输电导线固定在直立于地面的杆塔上以传输电能的输电线路。架设及维修比较方便&#xff0c;成本较低&#xff0c;但容易受到气象和环境&#xff08;如大风、雷击、污秽、冰雪等&#xff09;的影…

C#按关闭按钮实现最小化,按ESC才关闭的实现【含系统消息大全】

protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND 0x0112; const int SC_CLOSE 0xF060; if (m.Msg WM_SYSCOMMAND && (int)m.WParam SC_CLOSE) { // 屏蔽传入的消息事件 …

眠眠interview Question

1. Wkwebkit在异步回调 如何像webview的回调 一样在主线程回调。可以使用runloop 解决么&#xff1f; dispatch get main queue http://www.jianshu.com/p/a2fc399075e0 转载于:https://www.cnblogs.com/tufei7/p/7657617.html

哪些人适合参加软件测试培训

软件测试是现在很多企业需求都非常大的一个岗位&#xff0c;只要是互联网行业基本都是有需求的&#xff0c;那么想要学习软件测试&#xff0c;哪些人适合参加软件测试培训呢?来看看下面的详细介绍。 哪些人适合参加软件测试培训? 想从零开始进入软件技术行业 软件测试的优势是…

从iso镜像升级ubuntu

步骤&#xff1a; 1.从网上下载Alternate版本的ISO镜像 2.加载ubuntu镜像 # mount -t iso9660 -o loop ubuntu-11.10-alternate-i386.iso /mnt/cdrom/3.进入/mnt/cdrom/ 运行cdromupgrade 程序 # cd /mnt/cdrom/ # ./cdromupgrade转载于:https://www.cnblogs.com/dudp/archive…

技术图文:如何爬取一个地区的气象数据(下)?

背景 架空线路常见的故障有&#xff1a;风偏闪络故障、雷击跳闸故障、雷击断股故障、线路覆冰故障、线路污闪故障、线路外力破坏故障、线路鸟害故障等等。从这些故障中&#xff0c;我们可以看出天气对线路的安全运行起到非常重要的作用。 在上一篇图文 如何爬取一个地区的气象…

Android :landscape||portrait 切换

可在AndroidManifest.xml里面配置屏幕发现。 在<Activity>中加入这一行android:screenOrientation"landscape/portrait " android中每次屏幕的切换动会重启Activity&#xff08;可以在Activity销毁前保存当前活动的状态&#xff0c;在Activity再次Create的时候…

web前端开发培训完就业前景怎么样

很多人都在学习web前端技术&#xff0c;认为学好这一项编程技术&#xff0c;找工作是非常稳定的&#xff0c;那么到底web前端开发培训完就业前景怎么样呢?来看看下面的详细介绍就知道了。 web前端开发培训完就业前景怎么样? web前端薪资待遇 从图中我们能够看到web前端从业者…

技术图文:如何改进算法的运行效率?

背景 前段时间&#xff0c;一位好友发给我如下的文件&#xff1a; 每个CSV文件中的数据由三个属性组成&#xff0c;第一个属性为ID&#xff0c;第二个属性为X坐标&#xff0c;第三个属性为Y坐标。由于是二维数据&#xff0c;可以绘制出每个文件的散点图&#xff0c;把这些散点…

B树,B+树,B-树和B*树

B树 即二叉搜索树&#xff1a; 1.所有非叶子结点至多拥有两个儿子&#xff08;Left和Right&#xff09;&#xff1b; 2.所有结点存储一个关键字&#xff1b; 3.非叶子结点的左指针指向小于其关键字的子树&#xff0c;右指针指向大于其关键字的子树&#xff1b; 如&#xff1a; …

JS对象直接量,数组直接量和函数直接量

对象直接量创建一个对象&#xff1a; var obj {x:[1,2],y:23}; 代码跟下面是一样的。 var objnew Object(); obj.xnew Array(1,2); obj.y23; 测试&#xff1a;for(var i in obj) alert(obj[i]); 函数直接量&#xff1a;它是一个表达式而不是语句。 (function(){})() 如下例&am…

学习Java编程培训的书籍有哪些

学习java技术除了线上线下的培训学习&#xff0c;书籍的知识也是非常重要的&#xff0c;今天小编为大家整理的就是学习Java的一些书籍&#xff0c;Java书籍是程序员学习提升技能的重要学习渠道&#xff0c;通过书籍Java程序员可以学习当前流行、重要的相关技能。下面我们一起来…

Datawhale组队学习:数据结构与算法课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 数据结构与算法&…

live555学习笔记2-基础类

二 基础类 讲几个重要的基础类&#xff1a; BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类&#xff0e;比如UsageEnvironment代表了整个系统运行的环境&#xff0c;它提供了错误记录和错误报告的功能&#xff0c;无论哪一个类要输出错误&#x…

自己写的小工具集合

2019独角兽企业重金招聘Python工程师标准>>> 文件夹大小查看工具 用于查看文件夹下每个子文件和子文件夹的大小.以前想统计文件夹大小,只能点右键看属性,而且只能看到文总大小。这个小工具可以通过右键启动,而且能查看文件夹下所有文件和文件夹的大小. 以前用过类似…

哪些人适合学软件测试呢

软件测试是现在很多企业的一个刚需岗位&#xff0c;所以软件测试的发展前景是非常好的&#xff0c;想要了解哪些人适合学软件测试呢?来看看下面的详细介绍就知道了。 哪些人适合学软件测试呢? 1.无编程基础 测试的代码量仅为20%左右&#xff0c;无论是文科生还是非计算机专业…

javabean和EJB的区别

Java Bean 是可复用的组件&#xff0c;对Java Bean并没有严格的规范&#xff0c;理论上讲&#xff0c;任何一个Java类都可以是一个Bean。但通常情况下&#xff0c;由于Java Bean是被容器所创建(如Tomcat)的&#xff0c;所以Java Bean应具有一个无参的构造器&#xff0c;另外&am…

Datawhale组队学习:初级算法梳理课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 初级算法梳理 的任务…

CSS将长文字换行的方法 (转)

大家都知道连续的英文或数字能是容器被撑大&#xff0c;不能根据容器的大小自动换行&#xff0c;下面是 CSS如何将他们换行的方法&#xff01; 对于div 1.&#xff08;IE浏览器&#xff09;white-space:normal; word-break:break-all;这里前者是遵循标准。 #wrap{white-space:n…

学Java的软件哪些比较好用

很多java程序猿在工作的时候都会用一些辅助工具&#xff0c;辅助工具可以很好的帮助程序猿高效率的完成工作&#xff0c;那么具体学Java的软件哪些比较好用呢?来看看下面的详细介绍。 学Java的软件哪些比较好用? 1. Eclipse Eclipse做为一款开发源代码的Java扩展性开发平台&a…

DataTable的Compute功能详解

在为筛选器创建表达式时&#xff0c;用单引号将字符串括起来&#xff1a;"LastName Jones"下面的字符是特殊字符&#xff0c;如下面所解释的&#xff0c;如果它们用于列名称中&#xff0c;就必须进行转义&#xff1a;\n (newline)\t (tab)\r (carriage return)~()#\…

Datawhale第九期组队学习计划

Datawhale 组队学习 第九期Datawhale组队学习计划马上就要开始啦&#xff01; 这次共组织三个组队学习&#xff0c;涵盖了编程、机器学习理论以及动手实践的内容&#xff0c;大家可以按照需要选择参加。 数据结构与算法&#xff08;上&#xff09; 内容设计&#xff1a;光城…

Hibernate获取数据java.lang.StackOverflowError

原因&#xff1a;因为在重写toString()方法时&#xff0c;把关联的属性也放入到toString方法中了&#xff0c;去掉就可以了。 如&#xff1a;重写的toString方法中不能有关联关系IDCard属性idCard public class Person {private Integer id;private String name;private IDCard…

UI设计培训之UI设计系统知识

最近有很多小伙伴都在学习UI设计的相关知识&#xff0c;很多同学都是东边一学习一下&#xff0c;西边学习一下&#xff0c;根本没有明确的学习方法&#xff0c;对于这个问题小编为大家整理了一下学习UI设计的系统知识&#xff0c;一起看看吧! UI设计培训之UI设计系统知识&#…

java 中的 Enumeration 在Vector,Hashtable和web中的应用

public interface Enumeration<E> 实现 Enumeration 接口的对象&#xff0c;它生成一系列元素&#xff0c;一次生成一个。连续调用 nextElement方法将返回一系列的连续元素。 例如&#xff0c;要输出 Vector<E> v的所有元素&#xff0c;可使用以下方法&#xff1a;…