代码地址如下:
http://www.demodashi.com/demo/13369.html

背景描述

随着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)

代码地址如下:
http://www.demodashi.com/demo/13369.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

Android 6.0 超级简单的权限申请 (Permission)的更多相关文章

  1. Android 6.0 超级简单的权限申请2 (Permission)

    代码地址如下:http://www.demodashi.com/demo/13506.html 写在前面 上次写了一个权限申请的例子Android 6.0 超级简单的权限申请 (Permission) ...

  2. Android 6.0 最简单的权限获取方法 RxPermition EasyPermition

    Android 6.0 要单独的获取权限 这里提供两种很简单的方法 EasyPermition RxPermition EasyPermition https://github.com/googles ...

  3. 【Unity游戏开发】Android6.0以上的动态权限申请问题

    一.引子 最近公司的游戏在做安全性测试,期间也暴露出了不少安全上的问题.虽然我们今天要说的权限申请和安全性相关不大,但是也会影响到游戏的使用体验等,所以本篇博客中马三就想和大家谈谈Android6.0 ...

  4. android权限申请Permission

    代码地址如下:http://www.demodashi.com/demo/12432.html android在6.0系统以后,权限申请变得麻烦起来,今天介绍一个超级好用的权限申请库,我在使用中经过再 ...

  5. Android 开发基础入门篇: 动态权限申请

    说明: 咱们在安装APP的时候经常会看到,类似于下面的提示 goolge为了保护用户隐私,在android 6.0开始,某些隐私权限,必须用户允许以后,内部程序方可使用 这就涉及到权限动态申请问题. ...

  6. Android 6.0以上 需要运行时申请的权限

    转载:http://www.cnblogs.com/tangs/articles/6377347.html 自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifes ...

  7. Android 6.0的运行时权限

    原文  http://droidyue.com/blog/2016/01/17/understanding-marshmallow-runtime-permission/ 主题 安卓开发   Andr ...

  8. 聊一聊 Android 6.0 的运行时权限

    权限一刀切 棉花糖运行时权限 权限的分组 正常权限 正常权限列表 特殊权限危险权限 请求SYSTEM_ALERT_WINDOW 请求WRITE_SETTINGS 必须要支持运行时权限么 不支持运行时权 ...

  9. 聊一聊Android 6.0的运行时权限

    Android 6.0,代号棉花糖,自发布伊始,其主要的特征运行时权限就很受关注.因为这一特征不仅改善了用户对于应用的使用体验,还使得应用开发者在实践开发中需要做出改变. 没有深入了解运行时权限的开发 ...

随机推荐

  1. hdu 1529 Cashier Employment(差分约束)

    Cashier Employment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  2. 【无源汇有上下界可行流】ACdream1211-Reactor Cooling

    [题意] 给出一些边流量的上界和下界,问能否循环流通. [思路] 黄学长讲得很清楚,直接贴过来: 上界用ci表示,下界用bi表示. 下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci– b ...

  3. 【最大流/费用流】BZOJ1834-[ZJOI2010]network 网络扩容

    [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费 ...

  4. leetcode 576. Out of Boundary Paths

    leetcode 576 题意大概就是在一个m*n的网格中,在坐标为[i,j]的网格上放一个物体,在规定时间N(t<=N)中,有多少种方法把物体移动出去.物体只能上下左右移动,一次移动一格,移动 ...

  5. (转)DLL中导出函数的两种方式(dllexport与.def文件)

    DLL中导出函数的两种方式(dllexport与.def文件)http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792 ...

  6. SQL Server 2008数据库备份和还原(还原是必须有完整备份)

    转自lwccc, SQLserver2008数据库备份和还原问题(还原是必须有完整备份) 首先,我要说明的是你必须拥有完整的数据库备份,下面的还原教程,才算有用. 这个连接是某高手的异常恢复方法, 实 ...

  7. how to solve "[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!"

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. JIRA Service Desk 3.9.2 没有许可证

    https://my.atlassian.com/license/evaluation Server ID BFHT-0XFL-3NM8-3KRF SEN SEN-L10880225 License ...

  9. 解决kylin报错:java.lang.IllegalStateException

    一个kylin build job执行到第三步Extract Fact Table Distinct Columns时报错: 2017-05-24 20:04:07,930 ERROR [pool-9 ...

  10. python2解决中文问题(无论是注释还是代码含有中文)

    interpreter:翻译器; 方式一:在第一行写上#coding=utf-8 方式二:在第一行写上#-*- coding:utf-8 -*-