Android基于注解的6.0权限动态请求框架详解

作者:猛猛的小盆友 时间:2023-08-13 13:31:32 

前言

安卓6.0之后,一些敏感权限需要进行动态请求,虽说编写请求授权代码并不难,但是每次一需要权限就需要在视图中添加一段代码,严重影响代码美观,同时也增加了一点点工作量。

于是,小盆友闲暇之余基于AOP封装了一个基于注解的权限请求框架。如果有幸加入您的项目,使用过程中有问题或是有哪些不便,请留言区或github上与我交流,共同进步。如果喜欢这个框架请给个star和❤️。

github地址:https://github.com/zincPower/JPermission

先上图,看看效果。。。第一次录制,效果比较差,请将就下。可下载源码进行亲自操作。

Android基于注解的6.0权限动态请求框架详解

示例图

如何接入

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

标签:Android,权限动态
0
投稿

猜你喜欢

  • Android仿新浪微博分页管理界面(3)

    2023-08-04 19:14:02
  • SpringBoot整合MongoDB的步骤详解

    2023-10-11 17:20:32
  • java分割文本字符串的方法

    2023-11-13 03:52:24
  • 关于Java整合RocketMQ实现生产消费详解

    2022-12-31 07:44:34
  • Android自定义View多种效果解析

    2022-05-26 06:59:46
  • Java设计模式编程之解释器模式的简单讲解

    2022-01-24 16:03:32
  • springboot扩展MVC的方法

    2023-12-15 14:19:05
  • C++函数指针和回调函数使用解析

    2022-11-16 21:01:15
  • java8中parallelStream性能测试及结果分析

    2021-09-26 15:46:43
  • C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    2023-08-28 03:01:18
  • Java 中的Printstream介绍_动力节点Java学院整理

    2021-12-21 06:08:36
  • springboot+jwt+微信小程序授权登录获取token的方法实例

    2022-07-11 17:53:57
  • 深入c# 类和结构的区别总结详解

    2023-01-25 10:27:27
  • 详解java nio中的select和channel

    2021-08-09 19:17:39
  • Kotlin使用协程实现高效并发程序流程详解

    2021-12-27 20:47:21
  • 使用java实现BBS论坛发送邮件过程详解

    2022-12-19 16:58:30
  • .net的命名空间类库的简单介绍

    2023-01-19 17:56:27
  • Android新闻广告条滚动效果

    2023-05-13 10:30:37
  • C#实现文字转语音功能

    2022-06-18 13:07:59
  • SpringBoot零基础入门之基本操作与概念

    2023-10-25 00:41:36
  • asp之家 软件编程 m.aspxhome.com