• 前言

  之前使用过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. 转:攻击JavaWeb应用[4]-SQL注入[2]

    转:http://static.hx99.net/static/drops/tips-288.html 攻击JavaWeb应用[4]-SQL注入[2] 园长 · 2013/07/18 17:23 注: ...

  2. 一个菜鸟正在用SSH写一个论坛(1)

    嗯..搞定了注册和登录,说明我的SSH整合已经没有问题了,那么我就继续折腾了. 我的目的是用SSH框架写一个论坛(当然是功能最简单的那种),搞定了整合之后我打算先做出一些基本的功能,于是我就先简单的设 ...

  3. 北邮校赛 F. Gabriel's Pocket Money(树状数组)

    F. Gabriel's Pocket Money 2017- BUPT Collegiate Programming Contest - sync 时间限制 2000 ms 内存限制 65536 K ...

  4. Flask实战第63天:评论布局和功能实现

    评论后端逻辑实现 设计评论模型表, 编辑apps.models.py class CommentModel(db.Model): __tablename__ = 'comment' id = db.C ...

  5. Xamarin.Forms获取设备屏幕大小

    Xamarin.Forms获取设备屏幕大小 可以借助device.Display获取.基本形式如下: var display = device.Display;然后就可以获取屏幕大小.display. ...

  6. BZOJ 2323: [ZJOI2011]细胞

    嗯..csdn发得出markdown了..请移步~ 个人觉得那个帅一点 嗯 好题啊!! 矩乘+DP 蒟蒻的我一开始发现了斐波那契数列之后就不会搞了.. 那个..什么质量相同两种方案相同就是扯淡的..想 ...

  7. 【筛法求素数】Codeforces Round #426 (Div. 1) A. The Meaningless Game

    先筛出来1000以内的素数. 枚举x^(1/3) 和 y^(1/3)以内的素因子,这样除完以后对于x和y剩下的因子,小的那个的平方必须等于大的. 然后判断每个素因数的次数之和是否为3的倍数,并且小的那 ...

  8. 【动态规划+高精度】mr360-定长不下降子序列

    [题目大意] 韵哲君发现自己的面前有一行数字,当她正在琢磨应该干什么的时候,这时候,陈凡老师从天而降,走到了韵哲君的身边,低下头,对她耳语了几句,然后飘然而去. 陈凡老师说了什么呢,陈凡老师对韵哲君说 ...

  9. linux shell实现随机数多种方法(date,random,uuid)

    参考: http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html $ cat /proc/sys/kernel/random/uui ...

  10. css一些我所不熟练的属性

    <hr />  表示一条横线 css的三种创建方式: 外部样式表 <head> <link rel="stylesheet" type="t ...