之前也处理过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库的地址

https://github.com/hotchemi/PermissionsDispatcher

使用PermissionsDispatcher轻松解决Android权限问题的更多相关文章

  1. Android权限管理之RxPermission解决Android 6.0 适配问题

    前言: 上篇重点学习了Android 6.0的运行时权限,今天还是围绕着Android 6.0权限适配来总结学习,这里主要介绍一下我们公司解决Android 6.0权限适配的方案:RxJava+RxP ...

  2. Android权限管理之Android 6.0运行时权限及解决办法

    前言: 今天还是围绕着最近面试的一个热门话题Android 6.0权限适配来总结学习,其实Android 6.0权限适配我们公司是在今年5月份才开始做,算是比较晚的吧,不过现在Android 6.0以 ...

  3. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  4. Android权限机制

    Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...

  5. 如何解决Android SDK无法下载Package的问题(.net)

    有些用户在安装好Android SDK后,打开Android SDK Manager下载API时一直显示“Done loading packages”却迟迟不能前进,界面显示的Package空空如也. ...

  6. Android权限禁止及友好提示用户开通必要权限

    Android权限 Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用.操作系统或用户有不利影响的任何操作.这包括读写用户的私有数据(联系人,短信,相册,位置).读写其他应用的文 ...

  7. [转]如何解决android模拟器慢的问题

    分步阅读 在android开发的过程,发现android模拟器的速度不是一般的慢,那主要是因为android模拟器默认采用的是arm处理器造成的,这里主要提供两种方法: ① 利用intel虚拟硬件加速 ...

  8. Android权限说明 system权限 root权限

    原文链接:http://blog.csdn.net/rockwupj/article/details/8618655 Android权限说明 Android系统是运行在Linux内核上的,Androi ...

  9. android 权限问题分析

    Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...

随机推荐

  1. 关于 unsigned long long 于 long long

    long long 最大只有19位 : unsigned long long  最大有20位 ,原因牺牲了符合位来换取更大的记录

  2. 利用scrapy-client发布爬虫的远程服务器

    一.环境准备 远程服务器必须装有scapyd,我们使用的机器必须有scrapy-client(我这里是windows),并确保这两者正常安装并启动. 二.客户端准备上传 首先进入到爬虫项目的根文件夹: ...

  3. eclipse自定义代码注释

    效果如下: 自定义注释的方法:

  4. 【Qt开发】常用控件--QSpinBox和QDoubleSpinBox

    QSpinBox和QDoubleSpinBox 是UI设计常用的控件. QSpinBox可用于显示和输入整数,并可以在显示框中添加前缀或后缀. QDoubleSpinBox可用于显示和输入小数,并可以 ...

  5. JavaScript设计模式-5.接口

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. "Calendars" and "DateFormats" should not be static

    参见:Call to method of static java.text.DateFormat not advisable?   级别:bug, multi-threading Not all cl ...

  7. mysql 索引的简单使用

    1 索引(index) 索引是一个单独的.物理的数据库结构, 它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单 他的作用和字典的目录是一样的,就是为了加快查询的速度 ...

  8. Python基础(10) - 异常

    Python 异常:程序出现了错误而在正常控制流以外采取的行为 Python中常见的异常: 1. NameError:尝试访问一个未声明的变量 >>> something Trace ...

  9. Android运行时权限开启问题

    参考: http://www.cnblogs.com/whoislcj/p/6072718.html(重点这篇) https://www.jianshu.com/p/b4a8b3d4f587 http ...

  10. POJ 3710:Matrix Power Series

    Description 给出矩阵 \(n*n\) 的 矩阵\(A\) , 求 \(A^1+A^2+A^3...+A^k\) Solution 首先我们设 \(S_n=\sum_{i=1}^{n}A^i ...