SkillAgentSearch skills...

Permissions4m

:wrench:国产手机5.0、6.0权限适配框架/编译时注解框架/an Android Runtime Permissions Tool by using APT

Install / Use

/learn @jokermonn/Permissions4m
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Deprecated

此库不再维护

=============================================================

apk GitHub stars

platform license

lib processor annotation

中文|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):

图片1图片2图片3图片4

<h4>permissions4m</h4>

permissions4m 申请地理位置(小米)/permissions4m 申请联系人(小米)/permissions4m 申请手机状态(小米)/permissions4m 申请短信、日历(OPPO A57):

图片1图片2图片3图片4

引入依赖

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'
}

使用文档

版本迭代

<h3 id="todo">TODO</h3>
  • TODO:
    • help me
    • 增强魅族权限申请
    • 增强各5.0+权限申请
    • 由于作者最近忙于秋招,更新若不及时,望见谅,希望各位开发者共同维护这个库,毕竟作者个人手机有限、精力有限。该库源码真的很简单!
<h3 id="history">迭代历史</h3>
  • 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

  • v1.0.2

    • 适配大量国产机型,包括小米、OPPO、华为等
    • 更改为流式 API
    • 支持 Listener 接口回调
    • 截止于第81次 commits
  • v1.0.0

注意事项

<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 所修饰的方法

<h2 id="mutli">多个权限同步申请</h2>
  • 使用 @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

<h3 id="granted">@PermissionsGranted</h3>

授权成功时回调,注解中需要传入参数,分为两种情况:

  • 单参数:@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
View on GitHub
GitHub Stars1.6k
CategoryDevelopment
Updated4h ago
Forks221

Languages

Java

Security Score

95/100

Audited on Mar 29, 2026

No findings