一个注解搞定Android动态权限请求,FastPermission

FastPermission

FastPermission为android基于注解的权限请求框架,一个注解解决android权限请求,简单好用。
@NeedPermission支持在所有的方法中使用和activity的类上使用,提供了权限前操作,权限后的处理(权限拒绝或不再提醒)等功能。

使用

使用到的类:

  1. FastPermission:用于初始化的类
  2. @NeedPermission:请求权限的注解,可以作用于任何类的方法和activity类上,拥有参数:
    • value:要请求的权限
    • requestCode:请求码
    • isAllowExecution:当权限被拒绝是否继续执行
    • requestBefore:请求前调用的方法,和@PermissionBefore配合使用,会调用带有相同参数的被PermissionBefore注解的方法
    • permissionCanceled:请求被取消的方法,和@PermissionCanceled配合使用,会调用带有相同参数的被PermissionCanceled注解的方法
    • permissionDenied:请求被拒绝的方法,和@permissionDenied配合使用,会调用带有相同参数的被permissionDenied注解的方法
  3. @PermissionBefore:请求权限前的操作,可以在请求权限的本类中和配置类中使用,被注解的方法的参数只能是PermissionBeforeBean
    ,与NeedPermission联合使用,通过requestBefore匹配
  4. @PermissionCanceled:权限被取消(用户点击禁止权限)时调用的方法,可以在请求权限的本类中和配置类中使用
    ,被注解的方法的参数只能是PermissionCanceledBean,与Neddpermission联合使用,通过permissionCanceled匹配
  5. @PermissionDenied:权限被取消(用户勾选禁止后不再提示并点击禁止权限)时调用的方法,可以在请求权限的本类中和配置类中使用
    ,被注解的方法的参数只能是PermissionDeniedBean,与Neddpermission联合使用,通过permissionDenied匹配

使用方式

在你的Application的onCreate方法中使用FastPermission.getInstance().init()初始化,然后在需要权限的方法
FastPermissionConfig该类用于配置统一的权限前置操作、取消操作、拒绝操作的公共方法。

public void onCreate() {
    super.onCreate();
        FastPermission.getInstance().init(getApplicationContext(),new FastPermissionConfig());//FastPermissionConfig如果不用可设置为null
    }

方法中使用注解时:

@NeedPermission({Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE})
private void onClickContacts() {
    FragmentManager fragmentManager = getFragmentManager();
    Fragment cameraFragment = fragmentManager.findFragmentByTag("camera");
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    if (cameraFragment ==null) {
        fragmentTransaction.replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance(), "camera")
                .addToBackStack("camera")
                .commitAllowingStateLoss();
    }else {
        fragmentTransaction.show(cameraFragment);
    }
}

别忘了在manifest.xml文件中还要加权限哟

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>

以上就是简单使用方式,一个注释搞定,是不是很简单,如果有更多需求,请继续往下看

activity中使用注解时:

@NeedPermission(value = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE},
        requestBefore = Manifest.permission.CAMERA, permissionCanceled = Manifest.permission.CAMERA,
        permissionDenied = Manifest.permission.CAMERA, isAllowExecution = true)
public class CameraActivity extends Activity implements PermissionListener {

    @Override
    public void onPermissionGranted() {
        mHasPermission =true;
        initCamera();
    }

    @Override
    public void onPermissionCanceled(PermissionCanceledBean bean) {

    }

    @Override
    public void onPermissionDenied(PermissionDeniedBean bean) {

    }

    @PermissionBefore
    public void before(final PermissionBeforeBean beforeBean){
        new android.support.v7.app.AlertDialog.Builder(this)
                .setTitle("我们需要相机权限来正常拍照")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        beforeBean.proceed(true);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        beforeBean.proceed(false);
                    }
                })
                .show();
    }

}

FastPermissionConfig使用如下:

public  class FastPermissionConfig   {

    @PermissionBefore(Manifest.permission.CAMERA)//该注解注解的方法参数只能是PermissionBeforeBean
    public void before(final PermissionBeforeBean beforeBean){
        new android.support.v7.app.AlertDialog.Builder(beforeBean.getContext())
                .setTitle("来自配置文件,我们需要相机权限来正常拍照")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        beforeBean.proceed(true);//必须调用这个方法,确保正常往下执行
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        beforeBean.proceed(false);//必须调用这个方法,确保正常往下执行
                    }
                })
                .show();
    }

    @PermissionCanceled(Manifest.permission.CAMERA)//该注解注解的方法参数只能是PermissionCanceledBean
    public void cancel(final PermissionCanceledBean canceledBean){
        new android.support.v7.app.AlertDialog.Builder(canceledBean.getContext())
                .setTitle("来自配置文件,我们需要相机权限,请同意")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        canceledBean.againRequest();//调用该方法重试请求
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                })
                .show();
    }

    @PermissionDenied(Manifest.permission.CAMERA)//该注解注解的方法参数只能是PermissionDeniedBean
    public void denied(final PermissionDeniedBean deniedBean){
        new android.support.v7.app.AlertDialog.Builder(deniedBean.getContext())
                .setTitle("来自配置文件,我们需要权限,是否设置")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        deniedBean.toSettingActivity();//打开设置界面设置权限
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                    }
                })
                .show();
    }

}

当然,如果你还有什么特殊需要也可以直接用工具类PermissionUtils

PermissionUtils.requestPermissions(context, permissions, requestCode, new PermissionListener() {
            @Override
            public void onPermissionGranted() {
               
            }

            @Override
            public void onPermissionCanceled(PermissionCanceledBean bean) {
                
            }

            @Override
            public void onPermissionDenied(PermissionDeniedBean bean) {
                
            }
        });

依赖

在你的根目录的build.gradle中添加配置gradle-aspectj-plugin如下:

buildscript {
 
    repositories {
        maven { url "https://jitpack.io" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.github.zcxshare:gradle-aspectj-plugin:1.0.3'
    }
}
allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

然后在你的app的build.gradle中使用插件和依赖

apply plugin: 'com.android.application'
apply plugin: 'aspectj-plugin'
dependencies {
    implementation 'com.github.zcxshare:fast-permission:1.0.2'
}

混淆时添加到app的混淆文件proguard-rules.pro中

-keepclasseswithmembers class * {
@com.zcx.fast_permission_runtime.annotation.* <methods>;
}

-keepclassmembers class * {
public android.content.Context getContext();
}

项目地址:https://github.com/zcxshare/fast-permission
欢迎使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容