android 动态权限aop,Android — AOP 动态权限申请
初始化权限申请失败的监听
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 动态权限申请相关推荐
- android manifest 权限组,Android的单个或多个权限动态申请
前言 在Android 6.0(API 级别 23)以下申请权限是非常简单的,直接在AndroidManifest.xml这个配置文件中加入申请权限的列表就可以了,比如我要申请四个权限,如下: 但是在 ...
- android 6.0权限库,Android 6.0动态权限适配
前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...
- 【Android 逆向】Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )
文章目录 前言 一.Android 进程读取文件所需的权限 二.fopen 打开文件标志位 三.验证文件权限 前言 一.Android 进程读取文件所需的权限 通过 注入工具 , 将 libbridg ...
- 【Android 内存优化】Android 原生 API 图片压缩代码示例 ( PNG 格式压缩 | JPEG 格式压缩 | WEBP 格式压缩 | 动态权限申请 | Android10 存储策略 )
文章目录 一. 图片质量压缩 二. 图片尺寸压缩 三. Android 10 文件访问 四. 完整源码示例 上一篇博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供 ...
- android 动态录音权限,Android如何判断手机是否有录音权限的工具类
作用 判断手机是否有录音权限的工具类,兼容6.0以上以及以下android系统 测试环境 这篇文章是评论中的网友提出质疑后,经过重写修改与重写测试后编写的,我的调试环境是小米note3,Android ...
- Android 6.0及以上版本动态申请权限,11权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//安卓11文件权限// 先判断有没有权限if (Environment.isExter ...
- No6-6.从零搭建spring-cloud-alibaba微服务框架,添加用户鉴权逻辑,动态数据权限(使用AOP实现)等(六,no6-6)
代码地址与接口看总目录:[学习笔记]记录冷冷-pig项目的学习过程,大概包括Authorization Server.springcloud.Mybatis Plus~~~_清晨敲代码的博客-CSDN ...
- Android6.0动态设置读写权限(Android拍照或从相册中选图片预览出现问题)
做了一个Android拍照或从相册中选图片传服务器的demo,出现了问题虽然 图片路径 也可以打印出来,然后去看权限那里也申请了读写权限 <uses-permission android:nam ...
- Android权限说明大全及动态获取权限框架——Easypermissions
Android6.0把权限分成正常权限和危险权限,AndroidManifest中声明的正常权限系统会自动授予,而危险权限则需要在使用的时候用户明确授予. 换句话说,就是Android6.0以上的系统 ...
- android动态评论功能,Android辅助权限实战之微信自动评论与点赞
Android辅助权限实战之微信自动评论与点赞 当我们把辅助权限玩的比较熟悉 的时候,就可以释放我们的双手做一些有趣的事情了,例如之前网上流传的微信自动抢红包插件,就是使用的这个服务,不过我们今儿讲的 ...
最新文章
- mysql 最小时间 最大时间_leetcode539_go_最小时间差
- Numpy入门教程:02. 索引、切片与迭代
- 我竟然被“双亲委派”给虐了
- java中的构造方法,this、super的用法
- Hadoop-2.2.0学习之二HDFS联盟
- tab css html,纯css的tab 切换
- mysql去重DISTINCT
- 插入排序 希尔排序 C++
- HTML转义字符大全<转>
- 新的吉尼斯世界纪录 – 最快人类基因组测序,用时5 小时 2 分钟!
- OpenJDK和Java API区别_Linux下的JDK和OpenJDK有什么具体的区别
- wps计算机一级考试试题300,计算机一级考试WPS试题及答案
- Oracle 10g 安装教程
- 开机需要手动启动无线
- ubuntu终端打开文件夹_如何在Ubuntu的文件浏览器中将终端打开到特定文件夹
- Postman代理设置
- 【论文阅读】自动作文评分系统:一份系统的文献综述
- 【蓝桥杯】——备战冲刺最后两周
- redis,Redis Desktop Manger和IDEA Iedis的安装和使用
- 网易云视频播放器不使用Service实现后台播放