初始化权限申请失败的监听

PermissionUtil.init(new PermissionUtil.PermissionGlobalConfigCallback() {

//直接申请权限

@Override public void shouldShowRational(String permission, int ration) {

...

}

//跳转到设置申请权限

@Override public void onPermissionReject(String permission, int reject) {

...

}

});

定义全局Dialog提示权限申请失败信息。

showRationaleDialog()是没有勾选不再提示被拒绝的Dialog。

showRejectDialog()是被勾选不再提示的Dialog,需要手动跳转到设置页开启权限。

//直接申请权限的Dialog

private void showRationaleDialog(int ration) {

new AlertDialog.Builder(this).setTitle("权限申请").setMessage(getString(ration)).setNegativeButton("取消", null).show();

}

//需要跳转到设置的Dialog

private void showRejectDialog(int reject) {

new AlertDialog.Builder(this).setTitle("权限申请")

.setMessage(getString(reject))

.setPositiveButton("跳转到设置页", new DialogInterface.OnClickListener() {

@Override public void onClick(DialogInterface dialog, int which) {

//手动跳转到设置同意权限

Intent intent = new Intent();

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

intent.setData(Uri.fromParts("package", BuildConfig.APPLICATION_ID, null));

startActivity(intent);

dialog.dismiss();

}

})

.setNegativeButton("取消", null)

.show();

}

在PermissionUtil中定义申请权限的失败时提示的常量值

public static final int READ_EXTERNAL_STORAGE_RATIONALE = 100;//允许应用程序从外部存储读取被拒绝

public static final int READ_EXTERNAL_STORAGE_REJECT = 1000;//允许应用程序从外部存储读取勾选不再提示被拒绝提

public static final int WRITE_EXTERNAL_STORAGE_RATIONALE = 101;//允许应用程序写入外部存储被拒绝

public static final int WRITE_EXTERNAL_STORAGE_REJECT = 1010;//允许应用程序写入外部存储勾选不再提示被拒绝提

在需要申请权限的方法上添加注解@Permission,这个方法只有所有权限同意后才会执行。

@Permission(

permissions = { Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE },

rationales = { PermissionUtil.READ_EXTERNAL_STORAGE_RATIONALE,PermissionUtil.WRITE_EXTERNAL_STORAGE_RATIONALE },

rejects = {PermissionUtil.READ_EXTERNAL_STORAGE_REJECT, PermissionUtil.WRITE_EXTERNAL_STORAGE_REJECT })

private void getStorage(){

//只有获取全部权限才会执行

Toast.makeText(this,"获取存储权限成功",Toast.LENGTH_LONG).show();

}

在PermissionUtil.init(PermissionGlobalConfigCallback)重写的两个方法会在权限被拒绝后返回@Permission中rationales和rejects传入的常量值,获取到常量值后可以通过常量值进行匹配提示权限申请失败的信息。

private void permissionInit() {

//初始化权限申请监听

PermissionUtil.init(new PermissionUtil.PermissionGlobalConfigCallback() {

//直接申请权限被拒绝

@Override public void shouldShowRational(String permission, int ration) {

//通过@Permission传入的ration判断要提示的信息,如果没有匹配到ration就使用默认的提示信息。

switch (ration) {

//获取写入权限失败

case PermissionUtil.WRITE_EXTERNAL_STORAGE_RATIONALE:

//显示Dialog提示权限被拒绝 图2

showRationaleDialog(R.string.write_external_storage_permission_rationale);

break;

case PermissionUtil.READ_EXTERNAL_STORAGE_RATIONALE:

showRationaleDialog(R.string.read_external_storage_permission_rationale);

break;

case PermissionUtil.CAMERA_RATIONALE:

showRationaleDialog(R.string.camera_permission_rationale);

break;

case PermissionUtil.READ_PHONE_STATE_RATIONALE:

showRationaleDialog(R.string.read_phone_state_permission_rationale);

break;

case PermissionUtil.CALL_PHONE_RATIONALE:

showRationaleDialog(R.string.call_phone_permission_rationale);

break;

default://如果没有设置RATIONALE就使用默认提示

showRationaleDialog(R.string.permission_rationale);

break;

}

}

//跳转到设置申请权限

@Override public void onPermissionReject(String permission, int reject) {

//通过@Permission传入的ration判断要提示的信息,如果没有匹配到reject就使用默认的提示信息。

switch (reject) {

//获取写入权限失败

case PermissionUtil.WRITE_EXTERNAL_STORAGE_REJECT:

//显示Dialog提示权限被拒绝 图3

showRejectDialog(R.string.write_external_storage_permission_reject);

break;

case PermissionUtil.READ_EXTERNAL_STORAGE_REJECT:

showRejectDialog(R.string.read_external_storage_permission_reject);

break;

case PermissionUtil.CAMERA_REJECT:

showRejectDialog(R.string.camera_permission_reject);

break;

case PermissionUtil.READ_PHONE_STATE_REJECT:

showRejectDialog(R.string.read_phone_state_permission_reject);

break;

case PermissionUtil.CALL_PHONE_REJECT:

showRejectDialog(R.string.call_phone_permission_reject);

break;

default://如果没有设置REJECT就使用默认提示

showRejectDialog(R.string.permission_reject);

break;

}

}

});

}

android 动态权限aop,Android — AOP 动态权限申请相关推荐

  1. android manifest 权限组,Android的单个或多个权限动态申请

    前言 在Android 6.0(API 级别 23)以下申请权限是非常简单的,直接在AndroidManifest.xml这个配置文件中加入申请权限的列表就可以了,比如我要申请四个权限,如下: 但是在 ...

  2. android 6.0权限库,Android 6.0动态权限适配

    前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )

    文章目录 前言 一.Android 进程读取文件所需的权限 二.fopen 打开文件标志位 三.验证文件权限 前言 一.Android 进程读取文件所需的权限 通过 注入工具 , 将 libbridg ...

  4. 【Android 内存优化】Android 原生 API 图片压缩代码示例 ( PNG 格式压缩 | JPEG 格式压缩 | WEBP 格式压缩 | 动态权限申请 | Android10 存储策略 )

    文章目录 一. 图片质量压缩 二. 图片尺寸压缩 三. Android 10 文件访问 四. 完整源码示例 上一篇博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供 ...

  5. android 动态录音权限,Android如何判断手机是否有录音权限的工具类

    作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...

  6. Android 6.0及以上版本动态申请权限,11权限

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//安卓11文件权限// 先判断有没有权限if (Environment.isExter ...

  7. No6-6.从零搭建spring-cloud-alibaba微服务框架,添加用户鉴权逻辑,动态数据权限(使用AOP实现)等(六,no6-6)

    代码地址与接口看总目录:[学习笔记]记录冷冷-pig项目的学习过程,大概包括Authorization Server.springcloud.Mybatis Plus~~~_清晨敲代码的博客-CSDN ...

  8. Android6.0动态设置读写权限(Android拍照或从相册中选图片预览出现问题)

    做了一个Android拍照或从相册中选图片传服务器的demo,出现了问题虽然 图片路径 也可以打印出来,然后去看权限那里也申请了读写权限 <uses-permission android:nam ...

  9. Android权限说明大全及动态获取权限框架——Easypermissions

    Android6.0把权限分成正常权限和危险权限,AndroidManifest中声明的正常权限系统会自动授予,而危险权限则需要在使用的时候用户明确授予. 换句话说,就是Android6.0以上的系统 ...

  10. android动态评论功能,Android辅助权限实战之微信自动评论与点赞

    Android辅助权限实战之微信自动评论与点赞 当我们把辅助权限玩的比较熟悉 的时候,就可以释放我们的双手做一些有趣的事情了,例如之前网上流传的微信自动抢红包插件,就是使用的这个服务,不过我们今儿讲的 ...

最新文章

  1. mysql 最小时间 最大时间_leetcode539_go_最小时间差
  2. Numpy入门教程:02. 索引、切片与迭代
  3. 我竟然被“双亲委派”给虐了
  4. java中的构造方法,this、super的用法
  5. Hadoop-2.2.0学习之二HDFS联盟
  6. tab css html,纯css的tab 切换
  7. mysql去重DISTINCT
  8. 插入排序 希尔排序 C++
  9. HTML转义字符大全<转>
  10. 新的吉尼斯世界纪录 – 最快人类基因组测序,用时5 小时 2 分钟!
  11. OpenJDK和Java API区别_Linux下的JDK和OpenJDK有什么具体的区别
  12. wps计算机一级考试试题300,计算机一级考试WPS试题及答案
  13. Oracle 10g 安装教程
  14. 开机需要手动启动无线
  15. ubuntu终端打开文件夹_如何在Ubuntu的文件浏览器中将终端打开到特定文件夹
  16. Postman代理设置
  17. 【论文阅读】自动作文评分系统:一份系统的文献综述
  18. 【蓝桥杯】——备战冲刺最后两周
  19. redis,Redis Desktop Manger和IDEA Iedis的安装和使用
  20. 网易云视频播放器不使用Service实现后台播放

热门文章

  1. 安装MikTex+WinEdt
  2. [学习SLAM] 3D可视化 只viz模块和pangolin
  3. word2013图表题注:将图一-1改为图1-1
  4. 将Twitter4j与Scala结合使用以执行用户操作
  5. 让程序员工资随年龄增长递减更合理?
  6. 杨凌职业技术学院计算机专业宿舍,杨凌职业技术学院宿舍怎么样
  7. Java实现 LeetCode 88 合并两个有序数组
  8. I2C时序分析及模拟实现I2C主设备驱动
  9. 常用且标准的FPGA设计规范
  10. 尽管HTTP/3已经来了,HTTP/2也得了解啊