• 前言

  之前使用过AndPermission权限申请库,当开发者执行有权限的代码发生异常时,AndPermission会抓到异常并回调到失败中,这里要注意的是会抓到任何异常,不仅仅是没有权限时的异常.

这使得我在正常授权的回调中的一些异常,甚至是崩溃的异常都被它捕捉了,因此导致了一个奇怪的现象:权限申请到了,但是弹出了我在onDenied()方法中的吐司...

那么,我当时是不知道是因为自己的逻辑出现了错误,导致这个现象的,所以到处去找解决办法,去翻AndPermission的Issues和反复阅读文档,遗憾的是当时我并没有主要到上面那句话...

于是,我就使用了另外一个权限申请库,这就是接下来要讲的easypermissions,它是googlesamples里的一个成员,因此是谷歌推荐的权限申请库,放心大胆的使用吧.

  • easypermissions使用步骤
  1. 依赖  

    dependencies {
       implementation 'pub.devrel:easypermissions:1.2.0'
    } 

    请注意,EasyPermissions依赖于 Android Support Library 27.1.0 因此你需要使用 compileSdkVersion 27或更高版本。此更改应该是安全的,因为compileSdkVersion不会更改应用行为。

  2. 必要准备

    在你的Activity中重写onRequestPermissionsResult 方法

    public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    } @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
    }
  3. 申请权限
    private fun checkPermissions() {
       //首先判断权限是否已被授权,防止重复申请权限时,多次回调
    if (EasyPermissions.hasPermissions(this@MainActivity, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO...)) {
    //do something } else {
    EasyPermissions.requestPermissions(this@MainActivity, "为了方便录音,我们需要您的麦克风权限和读写权限", 100, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO)
    //第一个参数是context对象,第一个参数是提示字符串,第三个参数是请求码(可在回调中用来匹配),第四个参数是权限数组
    }
    }
  4. 回调  
    @AfterPermissionGranted(100)
    private void methodRequiresTwoPermission() {
    String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION};
    if (EasyPermissions.hasPermissions(this, perms)) {
    // Already have permission, do the thing
    // ...
    } else {
    // Do not have permissions, request them now
    EasyPermissions.requestPermissions(this,"为了方便录音,我们需要您的麦克风权限和读写权限", 100, perms);
      }
    }

    权限申请的回调有多种,上面只是其中一种,通过@AfterPermissionGranted(请求码)的方式.

    此外,你还可以实现PermissionCallbacks 接口

    public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
    
        @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    } @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    } @Override
    public void onPermissionsGranted(int requestCode, List<String> list) {
    // Some permissions have been granted
    // ...
    } @Override
    public void onPermissionsDenied(int requestCode, List<String> list) {
    // Some permissions have been denied
    // ...
    }
    }

    值得注意的是onPermissionsGranted和onPermissionsDenied两回调方法并不是全授权或全拒绝时才会响应,只要有权限被用户授权,那么就会走onPermissionsGranted,对于onPermissionsDenied也是一样的

  5. 权限被拒绝时重复申请

    在某些情况下,如果没有某些权限,您的应用将无法正常运行 如果用户使用“永不再问”选项拒绝这些权限,则您将无法向用户请求这些权限,并且必须在应用设置中更改这些权限。EasyPermissions.somePermissionPermanentlyDenied(...)在这种情况下,您可以使用该方法向用户显示对话框,并将其引导至您的应用程序的系统设置屏幕:

    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
    Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size()); // (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
    // This will display a dialog directing them to enable the permission in app settings.
    if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
    new AppSettingsDialog.Builder(this).build().show();
    }
    } @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data); if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
    // Do something after user returned from app settings screen, like showing a Toast.
    Toast.makeText(this, R.string.returned_from_app_settings_to_activity, Toast.LENGTH_SHORT)
    .show();
    }
    }
  • 总结

  文章开头提到由于使用AndPermission时遭遇了一种奇怪的现象,寻找解决办法而不得,才去了解easypermissions的,希望能够解决问题.替换运行时权限申请框架为easypermissions时,程序如愿崩溃了,我总算是看到了异常信息,解决掉之后,完美运行.

另外,我不打算换回AndPermission了,哈哈哈...

运行时权限请求框架easypermissions的更多相关文章

  1. 一行代码解决Android M新的运行时权限问题

    Android M运行时权限是个啥东西 啥是运行时权限呢?Android M对权限管理系统进行了改版,之前我们的App需要权限,只需在manifest中申明即可,用户安装后,一切申明的权限都可来去自如 ...

  2. Android 请求运行时权限

    写文件到sd卡中,会报权限问题,需要动态申请申请运行时权限 1. MainActivity.java public class MainActivity extends Activity { priv ...

  3. Android 6.0 运行时权限处理完全解析

    一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...

  4. 谈谈Android 6.0运行时权限理解

    前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...

  5. Android 6.0 运行时权限处理完全解析 (摘抄)

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...

  6. - Permission 运行时权限 总结 翻译 MD

    目录 目录 对运行时权限的一些理解 运行时权限使用案例 开源库:PermissionsDispatcher 注解 使用案例 使用步骤 测试代码 自动生成的类 官方文档:请求权限 Add permiss ...

  7. Android M Permission 运行时权限 学习笔记

    Android M Permission 运行时权限 学习笔记 从Android 6.0开始, 用户需要在运行时请求权限, 本文对运行时权限的申请和处理进行介绍, 并讨论了使用运行时权限时新老版本的一 ...

  8. Android M新的运行时权限开发者需要知道的一切

    android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...

  9. Android 6.0的运行时权限

    原文  http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发   Andr ...

随机推荐

  1. 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)

    P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...

  2. PHP文件包含小结

    协议 各种协议的使用有时是关键 file协议 file后面需是///,例如file:///d:/1.txt 也可以是file://e:/1.txt,如果是在当前盘则可以file:///1.txt 如果 ...

  3. NBUT 1223 Friends number

    暴力,打表. 计算出每一个数的因子之和,可以枚举$i$,让后将$i$的倍数都加上$i$.发现这样的只有$71$对,然后暴力就可以了. #include<cstdio> #include&l ...

  4. 2010-2011 ACM-ICPC, NEERC, Southern Subregional Contest C Explode 'Em All

    暴力枚举,状态压缩. 枚举哪几行放,复杂度为$O(2^{25})$,大概有$3000$多万种情况.假设有$x$行放了,没放的那几行状态或起来为$st$,如果$st$中$1$的个数大于$x$,那么不可取 ...

  5. 安卓 内容提供者 sql 区别

    韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 内容提供者 用户只需关心 操作数据的url 就可以了. 实现 了 应用间 数据共享.可以操作数据 ...

  6. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...

  7. python基础之面向过程编程,模块

    面向过程编程 面向过程的核心是过程,指的是解决问题的步骤,即先干什么再干什么,就好像设计一条流水线. 优点:复杂的问题流程化,进而简单化 缺点:可扩展性差,修改流水线的任意一个阶段,都会牵一发而动全身 ...

  8. django2与1的差别和视图

    django1与2路由的差别 在django1中的url在django2中为re_path django2中新增了path 1.from django.urls import path 2.不支持正则 ...

  9. NOI 二分算法练习

    1.NOI 二分法求函数的零点 总时间限制:  1000ms 内存限制:  65536kB 描述 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * ...

  10. Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵

    H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...