Android 6.0 超级简单的权限申请 (Permission)
背景描述
随着Android系统的不断升级,谷歌对用户的隐私是越来越注重了,给我们开发者带来了更多的繁琐。Android6.0增加了动态权限申请,虽然不难,但是实现起来会很繁琐,代码量会很多,通常都是在需要申请的地方调用ContextCompat.checkSelfPermission(context, permission)
判断是否已经有了需要的权限,如果没有,则需要调用ActivityCompat.requestPermissions(activity, permissions, mRequestCode)
进行申请,最后需要在onRequestPermissionsResult
回调中对requestCode
和每一个权限对应的result
进行int
型的判断,一整个过程下来非常繁琐。这对于永远追求简单简洁的程序员来说是不可忍受的,所有将整个过程封装一下,目标是尽可能的使使用变得更简单。
实现逻辑
- 先看项目结构
把申请权限的整个流程都封装到
PermissionHelper
类中,对外只提供一个使用方法runOnPermissionGranted(Activity activity, Runnable actionOnGranted, Runnable actionOnDenied, String... permissions)
把需要申请的权限列表、申请成功和失败的回调等传入方法中,先判断是否已经允许了这些权限,如果没有,则申请权限,申请结果将会回调到Activity中的onRequestPermissionsResult方法,所以需要用户手动重写onRequestPermissionsResult方法,写入一行固定的代码即可(看后面的使用方法)。
public static void runOnPermissionGranted(Activity activity, Runnable actionOnGranted, Runnable actionOnDenied, String... permissions) {
if (isPermissionGranted(activity, permissions)) {
new Handler(Looper.getMainLooper()).post(actionOnGranted);
} else {
mRunnableOnPermissionGranted.put(mRequestCode, actionOnGranted);
mRunnableOnPermissionDenied.put(mRequestCode, actionOnDenied);
ActivityCompat.requestPermissions(activity, permissions, mRequestCode);
mRequestCode++;
}
}
- 申请结果就会回调到PermissionHelper类中进行处理,判断用户是否允许了权限,对应的调用之前传入的runnable,这样开发者就不用再重复一整个申请权限的过程了,只需要调用runOnPermissionGranted即可。
public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (mRunnableOnPermissionGranted.containsKey(requestCode)) {
// 这里规定全部权限都通过才算通过
boolean grant = true;
// 在A申请权限,然后马上跳转到B,则grantResults.length=0
if (grantResults.length == 0) grant = false;
for (int result : grantResults) {
if (result == PackageManager.PERMISSION_DENIED) {
grant = false;
}
}
if (grant) {
new Handler(Looper.getMainLooper()).post(mRunnableOnPermissionGranted.get(requestCode));
} else {
new Handler(Looper.getMainLooper()).post(mRunnableOnPermissionDenied.get(requestCode));
}
mRunnableOnPermissionGranted.remove(mRequestCode);
mRunnableOnPermissionDenied.remove(mRequestCode);
}
}
使用方法一:
直接把DEMO中的
PermissionHelper
类复制到你项目中在
AndroidManifest
中注册权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 重写
Activity
中的onRequestPermissionsResult
方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
- 在
Activity
中直接调用即可
PermissionHelper.runOnPermissionGranted(this, () -> {
// 权限通过
}, () -> {
// 权限不通过
}, Manifest.permission.WRITE_EXTERNAL_STORAGE);
使用方法二:
直接把DEMO中的
PermissionHelper
类和PermissionActivity
类复制到你项目中在
AndroidManifest
中注册权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Activity
继承PermissionActivity
在
Activity
中直接调用即可
PermissionHelper.runOnPermissionGranted(this, () -> {
// 权限通过
}, () -> {
// 权限不通过
}, Manifest.permission.WRITE_EXTERNAL_STORAGE);
效果图
运行代码可能出现的问题
compileSdkVersion 27
,可以改成你电脑中存在的SDK版本。这里用的是
gradle-4.4-all.zip
,如果你用的是其它版本,那么可能会下载超级慢,建议改成你电脑中存在的gradle版本,改文件PermissionHelper/gradle/wrapper/gradle-wrapper.properties
即可。其它问题可以直接联系我。Android 6.0 超级简单的权限申请 (Permission)
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
Android 6.0 超级简单的权限申请 (Permission)的更多相关文章
- Android 6.0 超级简单的权限申请2 (Permission)
代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...
- Android 6.0 最简单的权限获取方法 RxPermition EasyPermition
Android 6.0 要单独的获取权限 这里提供两种很简单的方法 EasyPermition RxPermition EasyPermition https://github.com/googles ...
- 【Unity游戏开发】Android6.0以上的动态权限申请问题
一.引子 最近公司的游戏在做安全性测试,期间也暴露出了不少安全上的问题.虽然我们今天要说的权限申请和安全性相关不大,但是也会影响到游戏的使用体验等,所以本篇博客中马三就想和大家谈谈Android6.0 ...
- android权限申请Permission
代码地址如下:http://www.demodashi.com/demo/12432.html android在6.0系统以后,权限申请变得麻烦起来,今天介绍一个超级好用的权限申请库,我在使用中经过再 ...
- Android 开发基础入门篇: 动态权限申请
说明: 咱们在安装APP的时候经常会看到,类似于下面的提示 goolge为了保护用户隐私,在android 6.0开始,某些隐私权限,必须用户允许以后,内部程序方可使用 这就涉及到权限动态申请问题. ...
- Android 6.0以上 需要运行时申请的权限
转载:http://www.cnblogs.com/tangs/articles/6377347.html 自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifes ...
- Android 6.0的运行时权限
原文 http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发 Andr ...
- 聊一聊 Android 6.0 的运行时权限
权限一刀切 棉花糖运行时权限 权限的分组 正常权限 正常权限列表 特殊权限危险权限 请求SYSTEM_ALERT_WINDOW 请求WRITE_SETTINGS 必须要支持运行时权限么 不支持运行时权 ...
- 聊一聊Android 6.0的运行时权限
Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...
随机推荐
- 【Floyd】文化之旅
[NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 ...
- BZOJ 3790 神奇项链(manacher+DP+树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3790 [题目大意] 问最少用几个回文串可以构成给出串,重叠部分可以合并 [题解] 我们 ...
- BZOJ 4802 欧拉函数(Pollard_Rho)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4802 [题目大意] 已知N,求phi(N),N<=10^18 [题解] 我们用P ...
- 添加HP消息队列
Date: 20140210 Auth: Jin 两台服务器 120 HTTPSQS 236 HTTPPROXY 1.add host $ jump 120 #vim /etc/hosts 192.1 ...
- 【java】【多线程】等待开启的多个线程都执行完成,再做事情,怎么实现
今天在controller中写一个接口用来测试模拟多个请求同时到达 下订单的情况, 怎么能有效保证高并发下的库存和销量的一致性呢?[具体实现方法:https://www.cnblogs.com/sxd ...
- Mock -- 数据模拟
作者:张云龙链接:https://www.zhihu.com/question/35436669/answer/62753889来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 【iOS开发】canOpenURL: failed for URL
控制台输出 如图是在我启动一个 Xcode 7 + iOS 9 的 App 之后,控制台的输出. 这在 Xcode 6.4 + iOS 8 时,是不会有的情况,原因是[为了强制增强数据访问安全, iO ...
- 央行mlf,SLF,PSL,MLF,SLO
央行mlf是什么意思 中国人民银行 中国人民银行(The People's Bank Of China,英文简称PBOC),简称央行,是中华人民共和国的中央银行,中华人民共和国国务院组成部门.在国务院 ...
- 前端对比插件JS
https://github.com/kpdecker/jsdiff demo http://kpdecker.github.io/jsdiff/ 缺点:文件大于10M的就比较不了了 用于比对两段HT ...
- 剖析ASP.NET Core MVC(Part 1)- AddMvcCore(译)
原文:https://www.stevejgordon.co.uk/asp-net-core-mvc-anatomy-addmvccore发布于:2017年3月环境:ASP.NET Core 1.1 ...