• 前言

  之前使用过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. Apache配置文件相关命令

    转:http://www.365mini.com/page/apache-options-directive.htm Options指令是Apache配置文件中一个比较常见也比较重要的指令,Optio ...

  2. 使用CSS让元素尺寸缩小时保持宽高比例一致

    CSS中有一个属性padding对元素宽度存在依存关系.如果一个元素的 padding属性以百分比形式表示,padding 的大小是以该元素自身宽度为参照的. 若想要元素尺寸变化时,宽高比例不变,可以 ...

  3. AutoHotKey 常用脚本

    ; IMPORTANT INFO ABOUT GETTING STARTED: Lines that start with a ; semicolon, such as this one, are c ...

  4. SSL压力测试工具THC-SSL-DOS

    SSL压力测试工具THC-SSL-DOS   SSL广泛应用安全加密和认证领域,如HTTPS.POP等服务.使用SSL,会加重服务器的负担.例如,在协商阶段,服务器的CPU开销是客户端的15倍.Kal ...

  5. [NOIP2015] D1T2 信息传递

    洛谷题目链接:https://www.luogu.org/problemnew/show/2661 一道有很多种解法的题目 通过划归,发现就是求最小环 那么立即能想到的算法:1.Tarjan求强连通分 ...

  6. CCF 第六次计算机职业认证 第四题 收货 stl动态存储和fleury算法的综合应用

    问题描述 为了增加公司收入,F公司新开设了物流业务.由于F公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎,物流业务马上遍及了城市的每条街道.然而,F公司现在只安排了小明一个人负责所有街道的服 ...

  7. 【图论】Popular Cows

    [POJ2186]Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 34752   Accepted: ...

  8. BZOJ 1053 [HAOI2007]反素数ant(约数个数)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1053 [题目大意] 于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6 ...

  9. 【数论】【莫比乌斯反演】【线性筛】hdu6134 Battlestation Operational

    看这个题解吧:http://blog.csdn.net/wubaizhe/article/details/77338332 代码里顺便把几个常用的线性筛附上了. Key:1.gcd(i,j)==1利用 ...

  10. 【强连通分量缩点】【拓扑排序】【dp预处理】CDOJ1640 花自飘零水自流,一种相思,两处闲愁。

    题意: 在n个点m条边的有向图上,从1出发的回路最多经过多少个不同的点 可以在一条边上逆行一次 题解: 在同一个强连通分量中,显然可以经过当中的每一个点 因此先将强连通分量缩点,点权为强连通分量的点数 ...