运行时权限请求框架easypermissions
- 前言
之前使用过AndPermission权限申请库,当开发者执行有权限的代码发生异常时,AndPermission会抓到异常并回调到失败中,这里要注意的是会抓到任何异常,不仅仅是没有权限时的异常.
这使得我在正常授权的回调中的一些异常,甚至是崩溃的异常都被它捕捉了,因此导致了一个奇怪的现象:权限申请到了,但是弹出了我在onDenied()方法中的吐司...
那么,我当时是不知道是因为自己的逻辑出现了错误,导致这个现象的,所以到处去找解决办法,去翻AndPermission的Issues和反复阅读文档,遗憾的是当时我并没有主要到上面那句话...
于是,我就使用了另外一个权限申请库,这就是接下来要讲的easypermissions,它是googlesamples里的一个成员,因此是谷歌推荐的权限申请库,放心大胆的使用吧.
- easypermissions使用步骤
- 依赖
dependencies {
implementation 'pub.devrel:easypermissions:1.2.0'
}请注意,EasyPermissions依赖于 Android Support Library
27.1.0
因此你需要使用compileSdkVersion 27
或更高版本。此更改应该是安全的,因为compileSdkVersion
不会更改应用行为。 - 必要准备
在你的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);
}
} - 申请权限
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对象,第一个参数是提示字符串,第三个参数是请求码(可在回调中用来匹配),第四个参数是权限数组
}
} - 回调
@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也是一样的
- 权限被拒绝时重复申请
在某些情况下,如果没有某些权限,您的应用将无法正常运行 如果用户使用“永不再问”选项拒绝这些权限,则您将无法向用户请求这些权限,并且必须在应用设置中更改这些权限。
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的更多相关文章
- 一行代码解决Android M新的运行时权限问题
Android M运行时权限是个啥东西 啥是运行时权限呢?Android M对权限管理系统进行了改版,之前我们的App需要权限,只需在manifest中申明即可,用户安装后,一切申明的权限都可来去自如 ...
- Android 请求运行时权限
写文件到sd卡中,会报权限问题,需要动态申请申请运行时权限 1. MainActivity.java public class MainActivity extends Activity { priv ...
- Android 6.0 运行时权限处理完全解析
一.概述 随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化.对于6.0的几个主要的变化,查看查看官网的这篇文章http:// ...
- 谈谈Android 6.0运行时权限理解
前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...
- Android 6.0 运行时权限处理完全解析 (摘抄)
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...
- - Permission 运行时权限 总结 翻译 MD
目录 目录 对运行时权限的一些理解 运行时权限使用案例 开源库:PermissionsDispatcher 注解 使用案例 使用步骤 测试代码 自动生成的类 官方文档:请求权限 Add permiss ...
- Android M Permission 运行时权限 学习笔记
Android M Permission 运行时权限 学习笔记 从Android 6.0开始, 用户需要在运行时请求权限, 本文对运行时权限的申请和处理进行介绍, 并讨论了使用运行时权限时新老版本的一 ...
- Android M新的运行时权限开发者需要知道的一切
android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...
- Android 6.0的运行时权限
原文 http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发 Andr ...
随机推荐
- 转:攻击JavaWeb应用[4]-SQL注入[2]
转:http://static.hx99.net/static/drops/tips-288.html 攻击JavaWeb应用[4]-SQL注入[2] 园长 · 2013/07/18 17:23 注: ...
- 一个菜鸟正在用SSH写一个论坛(1)
嗯..搞定了注册和登录,说明我的SSH整合已经没有问题了,那么我就继续折腾了. 我的目的是用SSH框架写一个论坛(当然是功能最简单的那种),搞定了整合之后我打算先做出一些基本的功能,于是我就先简单的设 ...
- 北邮校赛 F. Gabriel's Pocket Money(树状数组)
F. Gabriel's Pocket Money 2017- BUPT Collegiate Programming Contest - sync 时间限制 2000 ms 内存限制 65536 K ...
- Flask实战第63天:评论布局和功能实现
评论后端逻辑实现 设计评论模型表, 编辑apps.models.py class CommentModel(db.Model): __tablename__ = 'comment' id = db.C ...
- Xamarin.Forms获取设备屏幕大小
Xamarin.Forms获取设备屏幕大小 可以借助device.Display获取.基本形式如下: var display = device.Display;然后就可以获取屏幕大小.display. ...
- BZOJ 2323: [ZJOI2011]细胞
嗯..csdn发得出markdown了..请移步~ 个人觉得那个帅一点 嗯 好题啊!! 矩乘+DP 蒟蒻的我一开始发现了斐波那契数列之后就不会搞了.. 那个..什么质量相同两种方案相同就是扯淡的..想 ...
- 【筛法求素数】Codeforces Round #426 (Div. 1) A. The Meaningless Game
先筛出来1000以内的素数. 枚举x^(1/3) 和 y^(1/3)以内的素因子,这样除完以后对于x和y剩下的因子,小的那个的平方必须等于大的. 然后判断每个素因数的次数之和是否为3的倍数,并且小的那 ...
- 【动态规划+高精度】mr360-定长不下降子序列
[题目大意] 韵哲君发现自己的面前有一行数字,当她正在琢磨应该干什么的时候,这时候,陈凡老师从天而降,走到了韵哲君的身边,低下头,对她耳语了几句,然后飘然而去. 陈凡老师说了什么呢,陈凡老师对韵哲君说 ...
- linux shell实现随机数多种方法(date,random,uuid)
参考: http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html $ cat /proc/sys/kernel/random/uui ...
- css一些我所不熟练的属性
<hr /> 表示一条横线 css的三种创建方式: 外部样式表 <head> <link rel="stylesheet" type="t ...