你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
首页
热门
推荐
精选
登录
|
注册
Android 6.0 超级简单的权限申请 (Permission)
立即下载
用AI写一个
金额:
0
元
支付方式:
免费下载
发布时间:2018-05-29
308人
|
浏览:5385次
|
收藏
|
分享
技术:Android开发
运行环境:AndroidStudio3.1.2、JDK8
概述
这是一个使得Android权限申请变得非常简单的工具类,把申请过程变得更加简洁。
详细
## 背景描述 随着Android系统的不断升级,谷歌对用户的隐私是越来越注重了,给我们开发者带来了更多的繁琐。Android6.0增加了动态权限申请,虽然不难,但是实现起来会很繁琐,代码量会很多,通常都是在需要申请的地方调用`ContextCompat.checkSelfPermission(context, permission)`判断是否已经有了需要的权限,如果没有,则需要调用`ActivityCompat.requestPermissions(activity, permissions, mRequestCode)`进行申请,最后需要在`onRequestPermissionsResult`回调中对`requestCode`和每一个权限对应的`result`进行`int`型的判断,一整个过程下来非常繁琐。这对于永远追求简单简洁的程序员来说是不可忍受的,所有将整个过程封装一下,目标是尽可能的使使用变得更简单。 ## 实现逻辑 * 先看项目结构 ![](/contentImages/image/20180529/c1dsvVjYQlJStk0Cmuw.png) * 把申请权限的整个流程都封装到`PermissionHelper`类中,对外只提供一个使用方法`runOnPermissionGranted(Activity activity, Runnable actionOnGranted, Runnable actionOnDenied, String... permissions)` * 把需要申请的权限列表、申请成功和失败的回调等传入方法中,先判断是否已经允许了这些权限,如果没有,则申请权限,申请结果将会回调到Activity中的onRequestPermissionsResult方法,所以需要用户手动重写onRequestPermissionsResult方法,写入一行固定的代码即可(看后面的使用方法)。 ```java 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即可。 ```java 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`中注册权限 ```xml
``` * 重写`Activity`中的`onRequestPermissionsResult`方法 ```java @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults); } ``` * 在`Activity`中直接调用即可 ```java PermissionHelper.runOnPermissionGranted(this, () -> { // 权限通过 }, () -> { // 权限不通过 }, Manifest.permission.WRITE_EXTERNAL_STORAGE); ``` ## 使用方法二: * 直接把DEMO中的`PermissionHelper`类和`PermissionActivity`类复制到你项目中 * 在`AndroidManifest`中注册权限 ```xml
``` * `Activity`继承`PermissionActivity` * 在`Activity`中直接调用即可 ```java PermissionHelper.runOnPermissionGranted(this, () -> { // 权限通过 }, () -> { // 权限不通过 }, Manifest.permission.WRITE_EXTERNAL_STORAGE); ``` ## 效果图 ![](/contentImages/image/20180529/LRgoFAbPdElDcKM9s7j.gif) ## 运行代码可能出现的问题 * `compileSdkVersion 27`,可以改成你电脑中存在的SDK版本。 * 这里用的是`gradle-4.4-all.zip`,如果你用的是其它版本,那么可能会下载超级慢,建议改成你电脑中存在的gradle版本,改文件`PermissionHelper/gradle/wrapper/gradle-wrapper.properties`即可。 * 其它问题可以直接联系我。
本实例支付的费用只是购买源码的费用,如有疑问欢迎在文末留言交流,如需作者在线代码指导、定制等,在作者开启付费服务后,可以点击“购买服务”进行实时联系,请知悉,谢谢
感谢
8
手机上随时阅读、收藏该文章 ?请扫下方二维码
相似例子推荐
评论
作者
AudienL
3
例子数量
359
帮助
13
感谢
评分详细
可运行:
4.5
分
代码质量:
4.5
分
文章描述详细:
4.5
分
代码注释:
4.5
分
综合:
4.5
分
作者例子
Android 6.0 超级简单的权限申请 (Permission)
一个完全摆脱findViewById的自动绑定库
Android 6.0 超级简单的权限申请2 (Permission)