android - 权限问题的解决办法: PermissionsDispatcher
访问量: 3132
参考: 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)
这个就不用加了。加了没有意义。显得很啰嗦。这个就是在每次 “拒绝” 操作之后,
会自动弹出这个,然后才会弹出系统的授权菜单。
按照精简的角度思考,就先不用这个了。