Permissions4m的使用

permissions4m,是国产 Android 权限申请最佳适配方案。解决了在小米手机上进行权限申请时,所遇到的一些坑,也增强了魅族手机中的权限申请。
下面我们直接看其使用:
申请权限

        Permissions4M.get(this)
                     .requestForce(true)//是否强制弹出权限申请对话框
                     .requestPageType(Permissions4M.PageType.MANAGER_PAGE)//返回的 intent 是跳转至**系统设置页面**
                     .requestPermissions(Manifest.permission.ACCESS_COARSE_LOCATION)//申请的权限
                     .requestCodes(LOCATION_CODE)//申请的code(自定义)
                     .request();

权限申请成功后回调

/**
     * 授权成功是回调
     * @param code
     */
    @PermissionsGranted({LOCATION_CODE})
    public void granted(int code){
        switch (code){
            case LOCATION_CODE:
                ToastUtils.showShort("定位权限申请成功");
                break;
            default:
                break;
        }
    }

权限申请失败后回调

/**
     * 授权失败时回调
     * @param code
     */
    @PermissionsDenied({LOCATION_CODE})
    public void denied(int code){
        switch (code){
            case LOCATION_CODE:
                ToastUtils.showShort("定位权限申请失败");
                break;
            default:
                break;
        }
    }

权限申请,二次授权时回调
如果用户不需要自己弹出提示对话框的话,使用@PermissionsRationale,具体代码如下:

/**
     * 二次授权时回调
     * @param code
     * 不需要自己弹出对话框的话,使用 PermissionsRationale
     */
    @PermissionsRationale({LOCATION_CODE})
    public void rationale(int code){
        switch (code){
            case LOCATION_CODE:
                ToastUtils.showShort("需要定位权限,应用才能正常使用...");
                break;
            default:
                break;
        }
    }

如果用户需要自己弹出提示对话框的话,使用@PermissionsCustomRationale,具体代码如下:

/**
     * 二次授权时回调
     * @param code
     * 需要自己弹出对话框的话,使用 PermissionsCustomRationale
     */
    @PermissionsCustomRationale({LOCATION_CODE})
    public void locationRationale(int code){
        switch (code){
            case LOCATION_CODE:
                new AlertDialog.Builder(PermissionActivity.this)
                        .setMessage("亲爱的用户,我们需要开启您的定位权限.")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ToastUtils.showShort("前往设置界面");
                                Permissions4M.get(PermissionActivity.this)
                                        .requestOnRationale()
                                        .requestPermissions(Manifest.permission.ACCESS_COARSE_LOCATION)
                                        .requestCodes(LOCATION_CODE)
                                        .request();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .show();
                break;
            default:
                break;
        }
    }

如果用户拒绝权限申请且选择了不在提示时,使用@PermissionsNonRationale;具体代码如下:

/**
     * 二次授权时回调
     * @param code
     * 拒绝权限且不再提示时,使用下面 PermissionsNonRationale
     */
    @PermissionsNonRationale({LOCATION_CODE})
    public void nonRationale(int code, final Intent intent){
        switch (code){
            case LOCATION_CODE:
                new AlertDialog.Builder(PermissionActivity.this)
                        .setMessage("亲爱的用户,我们需要开启您的定位权限.")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ToastUtils.showShort("前往设置界面");
                                startActivity(intent);//此处的Intent 类型为两种,一种是跳转至系统设置页面,另一种是跳至手机管家页面,而具体的设置方法请参考 注解回调 中 .requestPageType(int) 设置方法。
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .show();
                break;
            default:
                break;
        }
    }

当用户拒绝权限且选择不在提示时,会调用此权限申请回调方法

/**
     * 在 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(PermissionActivity.this, requestCode, grantResults);
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
补充:一次性申请多种权限
@PermissionsRequestSync(permission = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, value = {REQUEST_CAMERA, REQUEST_WRITE_STORAGE})

public class MainActivity extends AppCompatActivity {
    private final String TAG = MainActivity.class.getSimpleName();
    public static final int REQUEST_CAMERA = 0x1000;
    public static final int REQUEST_WRITE_STORAGE = 0x1001;

可以看到一次性申请多种权限是使用@PermissionsRequestSync,并且是写在类之外的;而且定义的code是公共的静态常量。这样要申请的权限和需要的code就定义完成了,下面看代码中的使用。

        Permissions4M.get(this)
                .requestForce(true)//是否强制弹出权限申请对话框
                .requestSync();

对于申请成功和失败的处理和前面的差不多,看代码:

    @PermissionsGranted({REQUEST_CAMERA, REQUEST_WRITE_STORAGE})
    public void granted(int code) {
        switch (code) {
            case REQUEST_CAMERA:
                Log.e(TAG, "照相机权限申请成功...");
                break;
            case REQUEST_WRITE_STORAGE:
                Log.e(TAG, "写存储权限申请成功...");
                break;
            default:
                break;
        }
    }

    @PermissionsDenied({REQUEST_CAMERA, REQUEST_WRITE_STORAGE})
    public void denied(int code) {
        switch (code) {
            case REQUEST_CAMERA:
                Log.e(TAG, "照相机权限申请失败...");
                break;
            case REQUEST_WRITE_STORAGE:
                Log.e(TAG, "写存储权限申请失败...");
                break;
            default:
                break;
        }
    }

一次性多种权限申请,也可以用下面的这个方法完成:

        Permissions4M.get(this)
                .requestForce(true)
                .requestPermissions(Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE)
                .requestCodes(100, 101, 102)
                .requestListener(new ListenerWrapper.PermissionRequestListener() {
                    @Override
                    public void permissionGranted(int i) {
                        switch (i){
                            case 100:
                                Log.e("LHC", "照相机权限申请成功.");
                                break;
                            case 101:
                                Log.e("LHC", "手机信息权限申请成功.");
                                break;
                            case 102:
                                Log.e("LHC", "读权限申请成功.");
                                break;
                            default:
                                break;
                        }
                    }

                    @Override
                    public void permissionDenied(int i) {
                        switch (i){
                            case 100:
                                Log.e("LHC", "照相机权限申请失败..");
                                break;
                            case 101:
                                Log.e("LHC", "手机信息权限申请失败..");
                                break;
                            case 102:
                                Log.e("LHC", "读写权限申请失败..");
                                break;
                            default:
                                break;
                        }
                    }

                    @Override
                    public void permissionRationale(int i) {//这个和permissionCustomRationale的调用二选一,根据自己的意愿。如果都写着也不影响,只会调用permissionCustomRationale。
                        switch (i){
                            case 100:
                                Log.e("LHC", "请开启照相机权限");
                                break;
                            case 101:
                                Log.e("LHC", "请开启手机信息权限");
                                break;
                            case 102:
                                Log.e("LHC", "请开启手机读写权限");
                                break;
                            default:
                                break;
                        }
                    }
                })
                .requestCustomRationaleListener(new ListenerWrapper.PermissionCustomRationaleListener() {
                    @Override
                    public void permissionCustomRationale(int i) {
                        switch (i) {
                            case 100:
                                new AlertDialog.Builder(PermissionActivity.this)
                                        .setMessage("亲爱的用户,我们需要开启您的照相机权限.")
                                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                ToastUtils.showShort("前往设置界面");
                                                Permissions4M.get(PermissionActivity.this)
                                                        .requestOnRationale()
                                                        .requestPermissions(Manifest.permission.CAMERA)
                                                        .requestCodes(100)
                                                        .request();
                                            }
                                        })
                                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                dialog.dismiss();
                                            }
                                        })
                                        .show();
                                break;
                            case 101:
                                new AlertDialog.Builder(PermissionActivity.this)
                                        .setMessage("亲爱的用户,我们需要开启您的手机信息权限.")
                                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                ToastUtils.showShort("前往设置界面");
                                                Permissions4M.get(PermissionActivity.this)
                                                        .requestOnRationale()
                                                        .requestPermissions(Manifest.permission.READ_PHONE_STATE)
                                                        .requestCodes(101)
                                                        .request();
                                            }
                                        })
                                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                dialog.dismiss();
                                            }
                                        })
                                        .show();
                                break;
                            case 102:
                                new AlertDialog.Builder(PermissionActivity.this)
                                        .setMessage("亲爱的用户,我们需要开启您的读写权限.")
                                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                ToastUtils.showShort("前往设置界面");
                                                Permissions4M.get(PermissionActivity.this)
                                                        .requestOnRationale()
                                                        .requestPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
                                                        .requestCodes(102)
                                                        .request();
                                            }
                                        })
                                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                dialog.dismiss();
                                            }
                                        })
                                        .show();
                                break;
                            default:
                                break;
                        }
                    }
                })
                .requestPage(new ListenerWrapper.PermissionPageListener() {
                    @Override
                    public void pageIntent(int i, final Intent intent) {
                        switch (i){
                            case 100:
                                new AlertDialog.Builder(PermissionActivity.this)
                                        .setMessage("照相机权限申请:\n我们需要您开启读取照相机权限(in activity with listener)")
                                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                startActivity(intent);
                                            }
                                        })
                                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                dialog.cancel();
                                            }
                                        })
                                        .show();
                                break;
                            case 101:
                                new AlertDialog.Builder(PermissionActivity.this)
                                        .setMessage("手机信息权限申请:\n我们需要您开启读取手机信息权限(in activity with listener)")
                                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                startActivity(intent);
                                            }
                                        })
                                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                            @Override
                                            public void onClick(DialogInterface dialog, int which) {
                                                dialog.cancel();
                                            }
                                        })
                                        .show();
                                break;
                            case 102:
                                break;
                            default:
                                break;
                        }
                    }
                })
                .request();
    }

也可以将上面的实现写成:

        Permissions4M.get(this)
                .requestForce(true)
                .requestPermissions(Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE)
                .requestCodes(100, 101, 102)
                .requestListener(this)
                .requestCustomRationaleListener(this)
                .requestPage(this)
                .request();

    @Override
    public void permissionGranted(int i) {
        switch (i) {
            case 100:
                Log.e("LHC", "照相机权限申请成功.");
                break;
            case 101:
                Log.e("LHC", "手机信息权限申请成功.");
                break;
            case 102:
                Log.e("LHC", "读权限申请成功.");
                break;
            default:
                break;
        }
    }

    @Override
    public void permissionDenied(int i) {
        switch (i) {
            case 100:
                Log.e("LHC", "照相机权限申请失败..");
                break;
            case 101:
                Log.e("LHC", "手机信息权限申请失败..");
                break;
            case 102:
                Log.e("LHC", "读写权限申请失败..");
                break;
            default:
                break;
        }
    }

    @Override
    public void permissionRationale(int i) {//这个和permissionCustomRationale的调用二选一,根据自己的意愿。如果都写着也不影响,只会调用permissionCustomRationale。
        switch (i) {
            case 100:
                Log.e("LHC", "请开启照相机权限");
                break;
            case 101:
                Log.e("LHC", "请开启手机信息权限");
                break;
            case 102:
                Log.e("LHC", "请开启手机读写权限");
                break;
            default:
                break;
        }
    }

    @Override
    public void permissionCustomRationale(int i) {
        switch (i) {
            case 100:
                new AlertDialog.Builder(PermissionActivity.this)
                        .setMessage("亲爱的用户,我们需要开启您的照相机权限.")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ToastUtils.showShort("前往设置界面");
                                Permissions4M.get(PermissionActivity.this)
                                        .requestOnRationale()
                                        .requestPermissions(Manifest.permission.CAMERA)
                                        .requestCodes(100)
                                        .request();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .show();
                break;
            case 101:
                new AlertDialog.Builder(PermissionActivity.this)
                        .setMessage("亲爱的用户,我们需要开启您的手机信息权限.")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ToastUtils.showShort("前往设置界面");
                                Permissions4M.get(PermissionActivity.this)
                                        .requestOnRationale()
                                        .requestPermissions(Manifest.permission.READ_PHONE_STATE)
                                        .requestCodes(101)
                                        .request();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .show();
                break;
            case 102:
                new AlertDialog.Builder(PermissionActivity.this)
                        .setMessage("亲爱的用户,我们需要开启您的读写权限.")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ToastUtils.showShort("前往设置界面");
                                Permissions4M.get(PermissionActivity.this)
                                        .requestOnRationale()
                                        .requestPermissions(Manifest.permission.READ_EXTERNAL_STORAGE)
                                        .requestCodes(102)
                                        .request();
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        })
                        .show();
                break;
            default:
                break;
        }
    }

    @Override
    public void pageIntent(int i, final Intent intent) {
        switch (i) {
            case 100:
                new AlertDialog.Builder(PermissionActivity.this)
                        .setMessage("照相机权限申请:\n我们需要您开启读取照相机权限(in activity with listener)")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                startActivity(intent);
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        })
                        .show();
                break;
            case 101:
                new AlertDialog.Builder(PermissionActivity.this)
                        .setMessage("手机信息权限申请:\n我们需要您开启读取手机信息权限(in activity with listener)")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                startActivity(intent);
                            }
                        })
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        })
                        .show();
                break;
            case 102:
                startActivity(intent);
                break;
            default:
                break;
        }
    }

这样权限申请就算完成了.

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,116评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 自从有了宝宝,便再也睡不了一个整觉。再也不能自由自在的吃喝玩乐。说实在的,我并不是一个坚强勇敢的妈妈。在没有宝宝之...
    凡也阅读 176评论 0 0
  • 火锅般的你 如果选择一样美食作比 你就是我爱的火锅 寒冷的日子里你暖透我的肠胃和双脚 炎热的日子里你给我一场舒服的...
    浮想集阅读 170评论 0 0
  • 我十二岁的时候,父亲拿来厚厚的一本册子,沉声问我:“当不当人匠?”我当时的回答是:“当。”“好,这是祖师爷留下来的...
    62f3575241cc阅读 4,699评论 1 27