Permissions4m
:wrench:国产手机5.0、6.0权限适配框架/编译时注解框架/an Android Runtime Permissions Tool by using APT
Install / Use
/learn @jokermonn/Permissions4mREADME
Deprecated
此库不再维护
=============================================================
中文|ENGLISH
前言
- 还在为
ActivityCompat.shouldShowRequestPermissionRationale(Activity, String)无法弹出权限申请对话框困惑么?permissions4m 让它必须弹出来 - 还在为明明授权失败,却回调的是权限申请成功方法而苦恼么?permissions4m 让它必须回调期望的方法
- 还在为用户拒绝且不再提示权限申请对话框而烦躁么?permissions4m 让它跳转到手机管家权限设置界面
- 还在为5.0权限申请而烦恼么?permissions4m 帮你解决它
permissions4m
意为 Permissions for M,基于 hongyangAndroid 的 MPermissions 项目二次开发,使用编译时注解,较运行时注解效率更高。起初目的是仅作为纯粹的 Andriod 编译时注解项目,较原有项目有以下升级:
- 支持 java8
- 支持一行代码同步请求多个权限
- 支持多种回调函数,代码可以更简洁
后 permissions4m 为适配国产机型而迭代,目前:
- 支持国产机型适配
- 支持国产机型5.0权限申请
权限申请官方文档:在运行时请求权限
<h2>permissions4m 与 AndPermission</h2> <h4>AndPermission 申请框架</h4>AndPermission 申请地理位置(小米)/AndPermission 申请联系人(小米)/AndPermission 申请手机状态(小米)/AndPermission 申请短信、日历(OPPO A57):
<h4>permissions4m</h4>permissions4m 申请地理位置(小米)/permissions4m 申请联系人(小米)/permissions4m 申请手机状态(小米)/permissions4m 申请短信、日历(OPPO A57):
引入依赖
Gradle 依赖
project 中的 build.gradle:
buildscript {
// ...
}
allprojects {
repositories {
// 请添加如下一行
maven { url 'https://jitpack.io' }
}
}
app 中的 build.gradle:
dependencies {
compile 'com.github.jokermonn:permissions4m:2.1.2-lib'
annotationProcessor 'com.github.jokermonn:permissions4m:2.1.2-processor'
}
使用文档
- 注意事项
- 接口回调
- Listener 回调
- 关于项目
版本迭代
<h3 id="todo">TODO</h3>- TODO:
- help me
- 增强魅族权限申请
- 增强各5.0+权限申请
- 由于作者最近忙于秋招,更新若不及时,望见谅,希望各位开发者共同维护这个库,毕竟作者个人手机有限、精力有限。该库源码真的很简单!
-
v2.1.2
- 增强地理位置权限申请
- 添加
code参数于 pageIntent 函数
-
v2.1.1
- 支持 oppo 5.0+ 权限申请
- 修复魅族空指针异常
-
v2.1.0
- 支持 listener 自定义 rationale
- 支持 listener 多权限同步申请
-
v2.0.4
- 支持手动关闭5.0权限申请
- 修复代理类空指针异常
-
v2.0.0
- 修复 fragment/support fragment 中低于6.0版本注解回调无效
- 修复 activity 强制申请回调失效
- 修复 activity 自定义二次回调失效
- 增强函数回调方式
- 增强录音权限申请
- 适配魅族5.0权限申请
-
v1.1.2
- 增强小米中的
READ_CONTACTS申请(国产畸形权限适配) - 增强小米中的
PHONE_STATE申请 - 增强小米中的
READ_SMS申请
- 增强小米中的
-
v1.0.9
- 修复内存泄露
-
v1.0.6
- 修复代理类空指针异常
-
v1.0.5
- 低版本默认授权成功
- 支持兼容 sdk 到
11
-
v1.0.3
- 修复
WRITE_CONTACTS权限 bug - 截止于第99次 commits
- 修复
-
v1.0.2
- 适配大量国产机型,包括小米、OPPO、华为等
- 更改为流式 API
- 支持 Listener 接口回调
- 截止于第81次 commits
-
v1.0.0
- 截止于第37次 commits
注意事项
<h3 id="must_add">必加的二次权限申请回调</h3>在 Activity 或 Fragment 中,需要手动添加 onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 方法以支持权限申请回调,代码如下即可:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]
grantResults) {
Permissions4M.onRequestPermissionsResult(MainFragment.this, requestCode, grantResults);
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
<h1 id="annotation">注解回调</h1>
<h2 id="single">单个权限申请</h2>
Permissions4M.get(MainActivity.this)
// 是否强制弹出权限申请对话框,建议设置为 true,默认为 true
// .requestForce(true)
// 是否支持 5.0 权限申请,默认为 false
// .requestUnderM(false)
// 权限,单权限申请仅只能填入一个
.requestPermissions(Manifest.permission.RECORD_AUDIO)
// 权限码
.requestCodes(AUDIO_CODE)
// 如果需要使用 @PermissionNonRationale 注解的话,建议添加如下一行
// 返回的 intent 是跳转至**系统设置页面**
// .requestPageType(Permissions4M.PageType.MANAGER_PAGE)
// 返回的 intent 是跳转至**手机管家页面**
// .requestPageType(Permissions4M.PageType.ANDROID_SETTING_PAGE)
.request();
将会回调相应的 @PermissionsGranted、@PermissionsDenied、@PermissionsRationale/PermissionsCustomRationale、@PermissionsNonRationale 所修饰的方法
-
使用
@PermissionsRequestSync修饰 Activity 或 Fragment -
传入两组参数
- value 数组:请求码
- permission 数组:请求权限
-
使用
Permissions4M.get(MainActivity.this).requestSync();进行同步权限申请
例:参考 sample 中 MainActivity 上的设置 ——
@PermissionsRequestSync(
permission = {Manifest.permission.BODY_SENSORS,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_CALENDAR},
value = {SENSORS_CODE,
LOCATION_CODE,
CALENDAR_CODE})
public class MainActivity extends AppCompatActivity
注:同步申请默认强制申请(requestForce(true)),同步申请不支持 @PermissionsNonRationale
授权成功时回调,注解中需要传入参数,分为两种情况:
- 单参数:
@PermissionsGranted(LOCATION_CODE),被修饰函数可不传入参数,例:
@PermissionsGranted(LOCATION_CODE)
public void granted() {
ToastUtil.show("地理位置授权成功");
}
传参的话必须是 int 型
@PermissionsGranted(LOCATION_CODE)
public void granted(int code) {
ToastUtil.show("地理位置授权成功");
}
- 多参数:
@PermissionsGranted({LOCATION_CODE, SENSORS_CODE, CALENDAR_CODE}),被修饰函数需要传入一个 int 参数,例:
@PermissionsGranted({LOCATION_CODE, SENSORS_CODE, CALENDAR_CODE})
public void granted(int code) {
switch (code) {
case LOCATION_CODE:
ToastUtil.show("地理位置权限授权成功");
break;
case SENSORS_CODE:
ToastUtil.show("传感器权限授权成功");
break;
case CALENDAR_CODE:
ToastUtil.show("读取日历权限授权成功");
break;
default:
break;
}
}
<h3 id="denied">@PermissionsDenied</h3>
授权失败时回调,注解中需要传入参数,分为两种情况:
- 单参数:
@PermissionsDenied(LOCATION_CODE),被修饰函数可不传入参数,例:
@PermissionsDenied(LOCATION_CODE)
public void denied() {
ToastUtil.show("地理位置授权失败");
}
传参的话必须是 int 型
@PermissionsDenied(LOCATION_CODE)
public void denied(int code) {
ToastUtil.show("地理位置授权失败");
}
- 多参数:
@PermissionsDenied({LOCATION_CODE, SENSORS_CODE, CALENDAR_CODE}),被修饰函数需要传入一个 int 参数,例:
@PermissionsDenied({LOCATION_CODE, SENSORS_CODE, CALENDAR_CODE})
public void denied(int code) {
switch (code) {
case LOCATION_CODE:
ToastUtil.show("地理位置权限授权失败");
break;
case SENSORS_CODE:
ToastUtil.show("传感器权限授权失败");
break;
case CALENDAR_CODE:
ToastUtil.show("读取日历权限授权失败");
break;
default:
break;
}
}
<h3 id="rationale">@PermissionsRationale</h3>
二次授权时回调,用于解释为何需要此权限,注解中需要传入参数,分为两种情况:
- 单参数:
@PermissionsRationale(LOCATION_CODE),被修饰函数可不传入参数,例:
@PermissionsRationale(LOCATION_CODE)
public void rationale() {
ToastUtil.show("请开启读取地理位置权限");
}
传参的话必须是 int 型
@PermissionsRationale(LOCATION_CODE)
public void denied(int code) {
ToastUtil.show("请开启读取地理位置权限");
}
- 多参数:`@PermissionsRationale({LOCATION_CODE, SENSORS
