一行注解搞定Android6.0运行时权限。
这是一款基于AOP思想的运行时权限库。帮助开发者免去繁琐的权限请求流程,一行注解就可以完成权限请求,大大降低了权限请求对业务代码对入侵。
- 支持单权限/多权限请求
- 一行注解申请/处理权限
- 支持私有化的调用方法
- 支持权限拒绝/不再询问的自定义处理
- 支持Activity、Fragment、Dialog、PopupWindow或者其他View中使用
- 支持kotlin、androidx
- 非侵入式
1.在project的build.gradle
中添加
buildscript {
dependencies {
...
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
}
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
}
2.在app/libary的build.gradle
中添加
apply plugin: 'android-aspectjx'
dependencies {
implementation 'com.github.bit-cores:SimplePermission:0.1.0'
}
注意:如果是多Module多工程,需要在每个用到运行时权限的Module中都添加apply plugin: 'android-aspectjx'
Basic
@CheckPermission(
value = [Manifest.permission.CAMERA],
requestCode = REQUEST_CODE_CAMERA,
describe = permissionDescribe
)
fun openCamera() {
//打开相机
var intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addCategory("android.intent.category.DEFAULT")
startActivityForResult(intent, 1)
}
这种方式及其简单,只需要申明权限/权限组、requestCode、请求拒绝的描述就可以了。如果用户同意权限,就直接执行方法; 如果用户拒绝,会用框架默认的Dialog去提示权限作用或者引导用户手动授权。
参数:
value:
权限数组,如果是多个权限用,隔开。
requestCode:
请求码。这是一次权限申请的标识,如果一个页面内有多处申请权限的地方,请确保请求码不同。
describe:
用户拒绝权限时,向用户解释说明的描述。
自定义权限拒绝的逻辑
@PermissionDenied(requestCode = REQUEST_CODE_CAMERA)
private fun deny() {
Log.e(TAG, "deny:--- @PermissionDenied ")
Toast.makeText(context, "开发者自己处理【@PermissionDenied】逻辑", Toast.LENGTH_SHORT).show()
}
@PermissionDeniedAndNoLongerAsk(requestCode = REQUEST_CODE_CAMERA)
private fun noLongerAsk() {
Log.e(TAG, "noLongerAsk:--- @PermissionDeniedAndNoLongerAsk ")
Toast.makeText(context, "开发者自己处理【@PermissionDeniedAndNoLongerAsk】逻辑", Toast.LENGTH_SHORT)
.show()
}
@CheckPermission
(必选)
检查权限。如果是Android6.0以下设备,直接执行方法;如果是6.0及以上设备,先判断是否已经获得了权限,
如果获得了权限,直接执行方法,如果没有权限,就向系统申请权限。
@PermissionDenied
(非必选)
用户拒绝了权限,且没有勾选【不再询问】)。默认的话,框架内部会弹框向用户解释权限,如果加了这个注解的话,就由开发者自定义拒绝权限的逻辑。
@PermissionDeniedAndNoLongerAsk
(非必选)
用户拒绝了权限,且勾选了【不再询问】)。默认的话,框架内部会弹框提示向用户解释权限,并且引导用户打开设置-应用
去手动授权。如果加了这个注解的话,就由开发者自定义这个逻辑。
Q1:Default interface methods are only supported starting with Android N (--min-api 24): void org.aspectj.lang.ProceedingJoinPoint.stack$AroundClosure(org.aspectj.runtime.internal.AroundClosure)
android {
......
//指定jdk版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}