Back

android - 权限问题的解决办法: PermissionsDispatcher

发布时间: 2017-09-02 12:01:00

参考:  https://github.com/permissions-dispatcher/PermissionsDispatcher 和 http://www.jianshu.com/p/dd5d2e4cb353

安卓5.1 以下的系统,默认是允许所有权限的。(安装的时候,会给出一个提示框,如果用户要安装app,就必须赋予app所有的权限)

安卓6.0 增加了权限控制。一些危险的权限可以动态添加了

(不过也有例外,我的三星note3 (s3)  , android 5.0, 安装后,可以动态修改权限。

我的vivo Y67A, android 6.0, 安装的界面居然是android 5.0的权限赋予的界面)

所以,自己写代码的话,有一些麻烦。所以我考虑使用 permissions dispatcher这个库。

过程:

1. 修改build.gradle: 

dependencies: { 
    compile 'com.github.hotchemi:permissionsdispatcher:2.4.0'
    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.4.0'
}

2. 找到你用的Activity, 为它加上注释:

// 这里,加上这个注释:
@RuntimePermissions
public class ScannerActivity extends BaseActivityForNative implements ZXingScannerView.ResultHandler {


3. 同时,找到对应调用摄像头的方法:

// 第二步: 修改调用的地方
public void onCreate(...) {
    //....
    // 2.1  之前是这样: 
//    setCameraView()

    // 2.2 修改之后是这样:
    // 注意: 下面这个class是动态生成的,方法也是动态生成的。 命名格式为
    //  XXActivityPermissionsDispatcher.yyWithCheck(this)
    ScannerActivityPermissionsDispatcher.setScannerViewWithCheck(this);
}

//  第一步,这个方法加上 annotation, 
@NeedsPermission(Manifest.permission.CAMERA)
    public void setScannerView(){
}

写好后,会有红色的提示,(对于上面临时生成的class/method) ,没关系,编译一下就可以了。(记得Activity的名字要找对!我就找错了,浪费了20分钟)

4. 这个时候,打开app到对应的页面,就会有弹窗出现了。询问权限。 

用户可以选择: 始终允许, 禁止, 始终禁止。

我们需要对 它们稍微做个处理。

4.1  禁止:

    @OnPermissionDenied(Manifest.permission.CAMERA)
    void onCameraDenied(){
        Toast.makeText(this, "you denied ", Toast.LENGTH_SHORT).show();
        // 最好给出一个AlertDialog
    }

4.2  永远禁止:

    @OnNeverAskAgain(Manifest.permission.CAMERA)
    void onCameraNeverAskedAgain(){
        Toast.makeText(this, "you NB!!!! never ask me~!", Toast.LENGTH_SHORT).show();
        // 最好给出一个AlertDialog
    }

5. 还有个不必要的东西: @OnShowRationale(Manifest.permission.CAMERA)

这个就不用加了。加了没有意义。显得很啰嗦。这个就是在每次 “拒绝” 操作之后,

会自动弹出这个,然后才会弹出系统的授权菜单。 

按照精简的角度思考,就先不用这个了。

Back