Android基于注解的6.0权限动态请求框架详解
作者:猛猛的小盆友 发布时间:2023-08-13 13:31:32
前言
安卓6.0之后,一些敏感权限需要进行动态请求,虽说编写请求授权代码并不难,但是每次一需要权限就需要在视图中添加一段代码,严重影响代码美观,同时也增加了一点点工作量。
于是,小盆友闲暇之余基于AOP封装了一个基于注解的权限请求框架。如果有幸加入您的项目,使用过程中有问题或是有哪些不便,请留言区或github上与我交流,共同进步。如果喜欢这个框架请给个star和❤️。
github地址:https://github.com/zincPower/JPermission
先上图,看看效果。。。第一次录制,效果比较差,请将就下。可下载源码进行亲自操作。
示例图
如何接入
1、在项目的gradle中添加如下代码
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.1.0' //添加这一行
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' } //添加这一行
}
}
值得一提:如果你的工程里gradle版本是3.0.0以上,请使用aspectjx:1.1.0以上版本,否则会报Required: PROJECT, SUB_PROJECTS, EXTERNAL_LIBRARIES. Found: EXTERNAL_LIBRARIES, PROJECT, PROJECT_LOCAL_DEPS, SUB_PROJECTS, SUB_PROJECTS_LOCAL_DEPS
aspectjx历史版本查看地址:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx/blob/master/CHANGELOG.md
2、在app的module中增加如下
代码
apply plugin: 'com.android.application'
apply plugin: 'android-aspectjx' //添加这一行
在依赖中增加:
compile 'com.github.zincPower:JPermission:0.1'
简单使用
1、在需要请求权限的方法加上注解 @Permission,请求权限可以多个,如下
//requestCode可设可不设,框架自带默认值。在取消和拒绝回调中,会将这个值返回,用于各自请求逻辑处理
@Permission({Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode = 100)
private void requestOnePermission() {
//do something
}
2、编写取消和拒绝(即点击了“不再提示”)回调,如下:
@PermissionCanceled()
private void cancel(CancelInfo cancelInfo) {
//do something when the permission was canceled.
}
@PermissionDenied()
private void deny(DenyInfo denyInfo) {
//do something when the permission was denied.
}
值得一提:如果被拒绝,可以弹一个对话框,询问是否要前往系统权限页面让用户自己手动开启。如果需要的话,可以通过以下代码前往(对话框自行解决,本框架不包含):
//前往开启权限的界面
JPermissionUtil.goToMenu(context);
高级使用
1、请求manifest中的所有权限(主要用于app开启时,进行一次权限请求)
//不需要回调监听
JPermissionUtil.requestAllPermission(this);
//需要回调监听
JPermissionUtil.requestAllPermission(this, new IPermission() {
@Override
public void ganted() {
Log.i(JPermissionHelper.TAG, "ganted====》申请manifest的全部");
}
@Override
public void denied(int requestCode, List<String> denyList) {
Log.i(JPermissionHelper.TAG, "denied====》申请manifest的全部{code=" + requestCode + ";denyList=" + denyList + "}");
}
@Override
public void canceled(int requestCode) {
Log.i(JPermissionHelper.TAG, "canceled===》申请manifest的全部{code= " + requestCode + "}");
}
});
某些特殊情况,初始请求中比较敏感(例如:读取手机短信 或 定位权限 等),可以使用以下代码进行剔除初始请求中所包含的权限
List<String> excluePermission = new ArrayList<>();
excluePermission.add(Manifest.permission.CAMERA);
excluePermission.add(Manifest.permission.ACCESS_FINE_LOCATION);
//不需要回调
JPermissionUtil.requestAllPermission(this, excluePermission);
//需要回调
JPermissionUtil.requestAllPermission(this, excluePermission, new IPermission() {
@Override
public void ganted() {
}
@Override
public void denied(int requestCode, List<String> denyList) {
}
@Override
public void canceled(int requestCode) {
}
});
2、配置前往的系统权限页,框架自带了默认的系统权限页,但如需根据不同品牌进行个性化设置,可在代码增加如下代码
//第一个参数为品牌,框架会根据Build.MANUFACTURER进行匹配(大小写均可)
//第二个参数为需要处理的类class文件,需要实现IMenu接口
JPermissionUtil.setManuFacturer("genymotion", MyTestGenymotionMenu.class);
3、设置有回调值的取消和拒绝回调。如果请求权限时,填了requestCode=200,则取消或拒绝时会调用requestCode相同(此处即为200)的方法。
@PermissionCanceled(requestCode = 200)
private void cancelCode200(CancelInfo cancelInfo){
Toast.makeText(this, "cancel__200", Toast.LENGTH_SHORT).show();
}
@PermissionDenied(requestCode = 200)
private void denyCode200(DenyInfo denyInfo){
Toast.makeText(this, "deny__200", Toast.LENGTH_SHORT).show();
}
值得一提:调用了requestCode相同的方法,同时也会调用不设置requestCode的方法。
4、service和fragment中均可使用
来源:https://www.jianshu.com/p/5e8fdd749383


猜你喜欢
- spring缓存cache的使用在spring配置文件中添加schema和spring对缓存注解的支持:<?xml version=&
- Java多线程线程的创建1.继承Thread2.实现Runnable3.实现Callable使用继承Thread类来开发多线程的应用程序在设
- SpringCloudStream配置以下配置摘自《SpringCloud微服务实战》,配置主要包括两大部分:Stream配置(基础配置、通
- 介绍和使用场景1)什么是消息一个事件,需要广播或者单独传递给某个接口2)为什么使用这个配置更新了,但是其他系统不知道是否更新SpringCl
- 整理文档,搜刮出一个Spring 实现excel及pdf导出表格的代码,稍微整理精简一下做下分享。excel 导出:package ligh
- 本文实例讲述了Android数据持久化之File机制。分享给大家供大家参考,具体如下:在使用Java SE平台开发C/S结构的软件中,Fil
- 前言CountDownLatch和CyclicBarrier两个同为java并发编程的重要工具类,它们在诸多多线程并发或并行场景中得到了广泛
- 使用NOPI导入Excel文档NOPI版本:2.3.0,依赖于NPOI的SharpZipLib版本:0.86,经测试适用于.net4.0+记
- JDK * 的过程JDK * 采用字节重组,重新生成对象来替代原始对象,以达到 * 的目的。JDK中有一个规范,在ClassPath下
- 案例:public interface ForumService { void removeTopic(int topicId); void
- 网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,
- 文档更新说明2018年09月24日 v1.0 初稿代理在生活中很常见,比如说婚介网站,其实就是找对象的代理;还有社保代理、人事代理;还有找黄
- 1、多态性多态性是面向对象的最后一个特征,它本身主要分为两个方面:方法的多态性:重载与覆写1 重载:同一个方法名称,根据参数类型以及个数完成
- 1、简单又有效的方法是使用PreparedStatement采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX(如:s
- 一、概述今天给大家带来SurfaceView的一个实战案例,话说自定义View也是各种写,一直没有写过SurfaceView,这个玩意是什么
- 本文实例讲述了C#获取程序文件相关信息的方法,分享给大家供大家参考。具体实现方法如下:using System.Reflection;usi
- 性能优化点:1.使用int不使用double。(单位用分不用元)也省去了还要用math.round四舍五入,把double类型数据只留小数点
- 问题描述:因为领导的一个需求,需要用到使用resultMap,很久没使用了,结果就除了点意外。就记录下这个问题准备两个类:author(作者
- 本文介绍了springcloud Feign的Hystrix支持,分享给大家,具体如下:一、Feign client中加入Hystrix的f
- 一、文件上传的必要前提A form 表单的 enctype 取值必须是:multipart/form-data(默认值是:applicati