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

栏目: 编程工具 · 发布时间: 6年前

内容简介:目录一、 前言二、支持的场景

目录

一、 前言

二、支持的场景

三、如何接入

四、简单使用

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

六、高级使用

一、前言

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

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

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

二、支持的场景

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

三、如何接入

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

2、在app的module中增加如下 代码

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

在依赖中增加:

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

四、简单使用

1、在需要请求权限的方法加上注解 @Permission,请求权限可以多个,如下

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

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

//只需加上注解 @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);
复制代码

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

1、需要通过 JPermissionHelper 提供一个context, 当然不注入也能正常使用,但只能在有上下文的类中使用 ,注入代码如下

JPermissionHelper.injectContext(this);
复制代码

温馨提示:为了避免内存泄漏,请于Application中注入

2、无上下文的类中如下编写(用法与“简单使用”一样),只需要在需要的地方调用对应的方法。例如调用此处的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() + "]");
    }

}
复制代码

六、高级使用

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中均可使用


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming PHP

Programming PHP

Rasmus Lerdorf、Kevin Tatroe、Peter MacIntyre / O'Reilly Media / 2006-5-5 / USD 39.99

Programming PHP, 2nd Edition, is the authoritative guide to PHP 5 and is filled with the unique knowledge of the creator of PHP (Rasmus Lerdorf) and other PHP experts. When it comes to creating websit......一起来看看 《Programming PHP》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具