使用PermissionsDispatcher轻松解决Android权限问题
之前也处理过6.0后的权限问题,直接处理很是麻烦。这次在github上搜到了关于权限星数最多的PermissionsDispatcher这个库,几个注释完美解决权限问题。
第一步 添加各种注释
1.@RuntimePermissions 注释在需要权限的Activity和Fragment
@RuntimePermissions
public class StudentChallengeActivity extends BaseActivity implements StudentChallengeContract.View {
2.@NeedsPermission 注释在需要权限的方法上后面,需要传入所需的权限
@NeedsPermission(Manifest.permission.RECORD_AUDIO)
void startRecord(ImageView img) {
long currentTime = Calendar.getInstance().getTimeInMillis();
if (currentTime - lastClickTime < ) {
ShowToast("时间太短");
}
if (!isPress && currWord < adapter.getItemCount() - ) {
img.setImageResource(R.drawable.btn_recod_style2);
isPress = true;
//
adapter.getItem(currWord).setWordColor();
adapter.notifyDataSetChanged(); //录音
evalUtil2.beginRe(sentenceList.get(currWord).getEng());
}
}
3.@OnShowRationale 注释在向用户解释为什么需要这个权限的方法上。
@OnShowRationale(Manifest.permission.RECORD_AUDIO)
void showRationaleForRecord(final PermissionRequest request){
new AlertDialog.Builder(this)
.setPositiveButton("好的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.proceed();
}
})
.setNegativeButton("不给", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
request.cancel();
}
})
.setCancelable(false)
.setMessage("挑战需要录音权限,应用将要申请录音权限")
.show();
}
这里必须要传个PermissionRequest参数。
request.proceed(); 调出系统申请权限的弹窗会执行@NeedsPermissio对应的方法
request.cancel(); 会执行@OnPermissionDenied对应的方法
如果想直接调用系统的
4.@OnPermissionDenied 被拒绝后调用的方法
@OnPermissionDenied(Manifest.permission.RECORD_AUDIO)
void showRecordDenied(){
ShowToast("拒绝录音权限将无法进行挑战");
}
5.@OnNeverAskAgain 勾选了不再提示禁止后调用的方法
@OnNeverAskAgain(Manifest.permission.RECORD_AUDIO)
void onRecordNeverAskAgain() {
new AlertDialog.Builder(this)
.setPositiveButton("好的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO: 2016/11/10 打开系统设置权限
dialog.cancel();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
})
.setCancelable(false)
.setMessage("您已经禁止了录音权限,是否现在去开启")
.show();
}
第二步 make project一下
这个库会自动生成[Activity Name] + PermissionsDispatcher这样的一个类。当要调用使用权限的方法的时候,不直接调用我们直接添加了@NeedsPermission的方法,而是调用这个类生成的XXXWithCheck的方法。XXX就是添加了@NeedsPermission的方法名
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
StudentChallengeActivityPermissionsDispatcher.startRecordWithCheck(StudentChallengeActivity.this,img);
}
最后还要复写下onRequestPermissionsResult这个方法,里面写上生成类的onRequestPermissionsResult,类似如下:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
StudentChallengeActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
执行的流程
需要权限的地方执行[Activity Name]PermissionsDispatcher.XXXWithCheck()
然后调用@OnShowRationale注释的方法,方法里必传的参数PermissionRequest request
- 执行request.proceed()调用系统申请权限的弹窗;
如果在系统申请弹窗中勾选了不在提示并且拒绝,会调用@OnNeverAskAgain的方法 - 执行request.cancel()会调用@OnPermissionDenied的方法
PermissionsDispatcher库的地址
使用PermissionsDispatcher轻松解决Android权限问题的更多相关文章
- Android权限管理之RxPermission解决Android 6.0 适配问题
前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...
- Android权限管理之Android 6.0运行时权限及解决办法
前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...
- Android权限管理之Permission权限机制及使用
前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...
- Android权限机制
Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...
- 如何解决Android SDK无法下载Package的问题(.net)
有些用户在安装好Android SDK后,打开Android SDK Manager下载API时一直显示“Done loading packages”却迟迟不能前进,界面显示的Package空空如也. ...
- Android权限禁止及友好提示用户开通必要权限
Android权限 Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用.操作系统或用户有不利影响的任何操作.这包括读写用户的私有数据(联系人,短信,相册,位置).读写其他应用的文 ...
- [转]如何解决android模拟器慢的问题
分步阅读 在android开发的过程,发现android模拟器的速度不是一般的慢,那主要是因为android模拟器默认采用的是arm处理器造成的,这里主要提供两种方法: ① 利用intel虚拟硬件加速 ...
- Android权限说明 system权限 root权限
原文链接:http://blog.csdn.net/rockwupj/article/details/8618655 Android权限说明 Android系统是运行在Linux内核上的,Androi ...
- android 权限问题分析
Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...
随机推荐
- Scrapyd-Client的安装
1. pip安装 这里推荐使用pip安装,相关命令如下: pip3 install scrapyd-client 2.验证安装 安装成功后会有一个可用命令,叫作scrapyd-deploy,即部署命令 ...
- Neo4j安装&入门&一些优缺点(转)
本篇将介绍Neo4j的安装,入门,和自己使用了一段时间后发现的优点缺点,争取简洁和实用. 如果你是第一次接触Neo4j,并且之前也都没接触过类似的Graph Database的话,建议先浏览一下我之前 ...
- Mac下使用Wine安装文件内容搜索工具Search and Replace
下载: (链接: https://pan.baidu.com/s/1mij7WX6 密码: xsu8) 安装: 1.安装Wine 参考:http://www.cnblogs.com/EasonJim/ ...
- (转)mysql双机热备的实现
mysql双机热备的实现 原文:http://www.zjian.me/web/php/mysql%E5%8F%8C%E6%9C%BA%E7%83%AD%E5%A4%87%E7%9A%84%E5%AE ...
- Linux 服务器开发常用命令操作
1)查看网络端口 netstat -na --ip 2)查看特定应用程序进程 ps -ef | grep vsftp or ps aux | grep xxx.exe 3)查看系统日志 vi /et ...
- java常量类的实现方式_枚举类_项目实践
前言 众所周知,系统里有很多比如订单状态.审核状态:性别.结算方式.交易类型等属性,这些属性只有几个值,一般用0.1.2.3等的数字标识存入数据库,每次对这些属性所属对象的增删改操作,都会在代码里给状 ...
- Spring Boot的filter简单使用
过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public FilterRegistrati ...
- IDEA Maven Mybatis generator 自动生成代码
IDEA Maven Mybatis generator 自动生成代码 一.安装配置maven以及在Idea中配置maven 安装过程步骤可以看上面的博文,里面介绍得很详细. 二.建数据表 DROP ...
- TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解)
前面博客 全网最详细的Git学习系列之介绍各个Git图形客户端(Windows.Linux.Mac系统皆适用ing)(图文详解) 全网最详细的Git学习系列之安装各个Git图形客户端(Windows. ...
- class对象存储
当加载一个类完成后,会在内存中实例化一个java.lang.Class类的对象,也就是该类的类对象.但是并没有明确规定必须在java堆中存放该类对象,对于HotSpot虚拟机而言,类对象存放在方法区里 ...