基于注解的6.0权限动态请求框架——JPermission

目录
1、 前言
2、支持的场景
3、如何接入
4、简单使用
5、无上下文的类中如何使用
6、高级使用
java

1、前言

安卓6.0以后,一些敏感权限须要进行动态请求,虽然说编写请求受权代码并不难,可是每次一须要权限就须要在视图中添加一段代码,严重影响代码美观,同时也增长了一点点工做量。 因而,小盆友闲暇之余基于AOP封装了一个基于注解的权限请求框架。若是有幸加入您的项目,使用过程当中有问题或是有哪些不便,请留言区或github上与我交流,共同进步。若是喜欢这个框架请给个star和❤️。android

github地址:github.com/zincPower/J…git

示例图

2、支持的场景

  1. activity
  2. fragment
  3. service
  4. 自定义view
  5. 无上下文的类中(须要经过 JPermissionHelper 注入context)

3、如何接入

一、在项目的gradle中添加以下代码github

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历史版本查看地址:github.com/HujiangTech…app

二、在app的module中增长以下 代码框架

apply plugin: 'com.android.application'
apply plugin: 'android-aspectjx' //添加这一行
复制代码

在依赖中增长:maven

compile 'com.github.zincPower:JPermission:0.5'
复制代码

4、简单使用

一、在须要请求权限的方法加上注解 @Permission,请求权限能够多个,以下ide

//requestCode可设可不设,框架自带默认值。在取消和拒绝回调中,会将这个值返回,用于各自请求逻辑处理
@Permission({Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode = 100)
private void requestOnePermission() {
    //do something
}
复制代码

二、编写取消和拒绝(即点击了“再也不提示”)回调,以下:gradle

//只需加上注解 @PermissionCanceled 和 参数类型为 CancelInfo 的一个参数便可
@PermissionCanceled()
private void cancel(CancelInfo cancelInfo) {
   //do something when the permission was canceled.
}
//只需加上注解 @PermissionDenied 和 参数类型为 DenyInfo 的一个参数便可
@PermissionDenied()
private void deny(DenyInfo denyInfo) {
   //do something when the permission was denied.
}
复制代码

值得一提:若是被拒绝,能够弹一个对话框,询问是否要前往系统权限页面让用户本身手动开启。若是须要的话,能够经过如下代码前往(对话框自行解决,本框架不包含):

//前往开启权限的界面
JPermissionUtil.goToMenu(context);
复制代码

5、无上下文的类中如何使用

一、须要经过 JPermissionHelper 提供一个context,固然不注入也能正常使用,但只能在有上下文的类中使用,注入代码以下

JPermissionHelper.injectContext(this);
复制代码

舒适提示:为了不内存泄漏,请于Application中注入

二、无上下文的类中以下编写(用法与“简单使用”同样),只须要在须要的地方调用对应的方法。例如调用此处的requestInNormalClass方法便可

public class NoneContext {

    private final String TAG = NoneContext.class.getSimpleName();

    @Permission(value = {Manifest.permission.ACCESS_FINE_LOCATION}, requestCode = 200)
    public void requestInNormalClass() {
        Log.i(TAG, "请求定位权限成功,200");
    }

    @PermissionCanceled()
    private void cancel(CancelInfo cancelInfo) {
        Log.i(TAG, "cancel:" + cancelInfo.getRequestCode());
    }

    @PermissionDenied()
    private void deny(DenyInfo denyInfo) {
        Log.i(TAG, "deny [code:" + denyInfo.getRequestInfo() + " ; deny:" + denyInfo.getDeniedPermissions() + "]");
    }

}
复制代码

6、高级使用

一、请求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) {

    }
});

复制代码

二、配置前往的系统权限页,框架自带了默认的系统权限页,但如需根据不一样品牌进行个性化设置,可在代码增长以下代码

//第一个参数为品牌,框架会根据Build.MANUFACTURER进行匹配(大小写都可)
//第二个参数为须要处理的类class文件,须要实现IMenu接口
JPermissionUtil.setManuFacturer("genymotion", MyTestGenymotionMenu.class);
复制代码

三、设置有回调值的取消和拒绝回调。若是请求权限时,填了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的方法。

四、service和fragment中都可使用

若是须要更多的交流与探讨,能够经过如下微信二维码加小盆友好友。

相关文章
相关标签/搜索