Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

news/2024/11/13 20:06:59 标签: 移动开发, java

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

96 
ifadai 
2017.06.16 16:22* 字数 318 阅读 3637评论 1

PermissionUtil

经常写Android运行时权限申请代码,每次都是复制过来之后,改一下权限字符串就用,把代码搞得乱糟糟的,于是便有了封装工具类的想法,话不多说,先看怎么用:

工具类及Demo:github

简洁版申请权限

申请一个权限:

java">java">    PermissionUtils.checkAndRequestPermission(mContext, PERMISSION_CAMERA, REQUEST_CODE_CAMERA,
                new PermissionUtils.PermissionRequestSuccessCallBack() {
            @Override
            public void onHasPermission() { // 权限已被授予 toCamera(); } }); 

然后在onRequestPermissionsResult中:

if(PermissionUtils.isPermissionRequestSuccess(grantResults))
                {
                    // 权限申请成功
                    toCamera();
                }

什么?要同时申请多个权限?

java">java">    PermissionUtils.checkAndRequestMorePermissions(mContext, PERMISSIONS, REQUEST_CODE_PERMISSIONS,
                new PermissionUtils.PermissionRequestSuccessCallBack() {
            @Override
            public void onHasPermission() { // 权限已被授予 toCamera(); } }); 

当然上面这些都不是申请权限的正确姿势,理想的姿势应该是:

  • 第一次申请权限:按照正常流程走;
  • 如果用户第一次拒绝了权限申请,第二次申请时应向用户解释权限用途;
  • 如果用户勾选了“不再询问”选项,应引导用户去设置页手动开启权限。

如图:

 
第一次申请权限
 
第二次申请权限并禁止询问

于是,引申出了复杂版的权限申请方法:

自定义权限申请:

java">java">PermissionUtils.checkPermission(mContext, PERMISSION_CAMERA,
                new PermissionUtils.PermissionCheckCallBack() {
            @Override
            public void onHasPermission() { // 已授予权限 toCamera(); } @Override public void onUserHasAlreadyTurnedDown(String... permission) { // 上一次申请权限被拒绝,可用于向用户说明权限原因,然后调用权限申请方法。 } @Override public void onUserHasAlreadyTurnedDownAndDontAsk(String... permission) { // 第一次申请权限或被禁止申请权限,建议直接调用申请权限方法。 } }); 

然后在onRequestPermissionsResult中:

java">java">PermissionUtils.onRequestPermissionResult(mContext, PERMISSION_CAMERA, grantResults, new PermissionUtils.PermissionCheckCallBack() {
                    @Override
                    public void onHasPermission() { toCamera(); } @Override public void onUserHasAlreadyTurnedDown(String... permission) { Toast.makeText(mContext, "我们需要"+Arrays.toString(permission)+"权限", Toast.LENGTH_SHORT).show(); } @Override public void onUserHasAlreadyTurnedDownAndDontAsk(String... permission) { Toast.makeText(mContext, "我们需要"+Arrays.toString(permission)+"权限", Toast.LENGTH_SHORT).show(); // 显示前往设置页的dialog showToAppSettingDialog(); } }); 

基本使用就是这些了,包括前往应用设置页的方法,也在工具类里面,具体使用可以看demo。

工具类及Demo:github

贴一下工具类代码:

package com.fadai.library;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import java.util.ArrayList; import java.util.List; /** * <pre> * author : FaDai * e-mail : i_fadai@163.com * time : 2017/06/13 * desc : xxxx描述 * version: 1.0 * </pre> */ public class PermissionUtils { /** * 检测权限 * * @return true:已授权; false:未授权; */ public static boolean checkPermission(Context context, String permission) { if (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED) return true; else return false; } /** * 检测多个权限 * * @return 未授权的权限 */ public static List<String> checkMorePermissions(Context context, String[] permissions) { List<String> permissionList = new ArrayList<>(); for (int i = 0; i < permissions.length; i++) { if (!checkPermission(context, permissions[i])) permissionList.add(permissions[i]); } return permissionList; } /** * 请求权限 */ public static void requestPermission(Context context, String permission, int requestCode) { ActivityCompat.requestPermissions((Activity) context, new String[]{permission}, requestCode); } /** * 请求多个权限 */ public static void requestMorePermissions(Context context, List permissionList, int requestCode) { String[] permissions = (String[]) permissionList.toArray(new String[permissionList.size()]); requestMorePermissions(context, permissions, requestCode); } /** * 请求多个权限 */ public static void requestMorePermissions(Context context, String[] permissions, int requestCode) { ActivityCompat.requestPermissions((Activity) context, permissions, requestCode); } /** * 判断是否已拒绝过权限 * * @return * @describe :如果应用之前请求过此权限但用户拒绝,此方法将返回 true; * -----------如果应用第一次请求权限或 用户在过去拒绝了权限请求, * -----------并在权限请求系统对话框中选择了 Don't ask again 选项,此方法将返回 false。 */ public static boolean judgePermission(Context context, String permission) { if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, permission)) return true; else return false; } /** * 检测权限并请求权限:如果没有权限,则请求权限 */ public static void checkAndRequestPermission(Context context, String permission, int requestCode) { if (!checkPermission(context, permission)) { requestPermission(context, permission, requestCode); } } /** * 检测并请求多个权限 */ public static void checkAndRequestMorePermissions(Context context, String[] permissions, int requestCode) { List<String> permissionList = checkMorePermissions(context, permissions); requestMorePermissions(context, permissionList, requestCode); } /** * 检测权限 * * @describe:具体实现由回调接口决定 */ public static void checkPermission(Context context, String permission, PermissionCheckCallBack callBack) { if (checkPermission(context, permission)) { // 用户已授予权限 callBack.onHasPermission(); } else { if (judgePermission(context, permission)) // 用户之前已拒绝过权限申请 callBack.onUserHasAlreadyTurnedDown(permission); else // 用户之前已拒绝并勾选了不在询问、用户第一次申请权限。 callBack.onUserHasAlreadyTurnedDownAndDontAsk(permission); } } /** * 检测多个权限 * * @describe:具体实现由回调接口决定 */ public static void checkMorePermissions(Context context, String[] permissions, PermissionCheckCallBack callBack) { List<String> permissionList = checkMorePermissions(context, permissions); if (permissionList.size() == 0) { // 用户已授予权限 callBack.onHasPermission(); } else { boolean isFirst = true; for (int i = 0; i < permissionList.size(); i++) { String permission = permissionList.get(i); if (judgePermission(context, permission)) { isFirst = false; break; } } String[] unauthorizedMorePermissions = (String[]) permissionList.toArray(new String[permissionList.size()]); if (isFirst)// 用户之前已拒绝过权限申请 callBack.onUserHasAlreadyTurnedDownAndDontAsk(unauthorizedMorePermissions); else // 用户之前已拒绝并勾选了不在询问、用户第一次申请权限。 callBack.onUserHasAlreadyTurnedDown(unauthorizedMorePermissions); } } /** * 检测并申请权限 */ public static void checkAndRequestPermission(Context context, String permission, int requestCode, PermissionRequestSuccessCallBack callBack) { if (checkPermission(context, permission)) {// 用户已授予权限 callBack.onHasPermission(); } else { requestPermission(context, permission, requestCode); } } /** * 检测并申请多个权限 */ public static void checkAndRequestMorePermissions(Context context, String[] permissions, int requestCode, PermissionRequestSuccessCallBack callBack) { List<String> permissionList = checkMorePermissions(context, permissions); if (permissionList.size() == 0) { // 用户已授予权限 callBack.onHasPermission(); } else { requestMorePermissions(context, permissionList, requestCode); } } /** * 判断权限是否申请成功 */ public static boolean isPermissionRequestSuccess(int[] grantResults) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) return true; else return false; } /** * 用户申请权限返回 */ public static void onRequestPermissionResult(Context context, String permission, int[] grantResults, PermissionCheckCallBack callback) { if (PermissionUtils.isPermissionRequestSuccess(grantResults)) { callback.onHasPermission(); } else { if (PermissionUtils.judgePermission(context, permission)) { callback.onUserHasAlreadyTurnedDown(permission); } else { callback.onUserHasAlreadyTurnedDownAndDontAsk(permission); } } } /** * 用户申请多个权限返回 */ public static void onRequestMorePermissionsResult(Context context, String[] permissions, PermissionCheckCallBack callback) { boolean isBannedPermission = false; List<String> permissionList = checkMorePermissions(context, permissions); if (permissionList.size() == 0) callback.onHasPermission(); else { for (int i = 0; i < permissionList.size(); i++) { if (!judgePermission(context, permissionList.get(i))) { isBannedPermission = true; break; } } // 已禁止再次询问权限 if (isBannedPermission) callback.onUserHasAlreadyTurnedDownAndDontAsk(permissions); else // 拒绝权限 callback.onUserHasAlreadyTurnedDown(permissions); } } /** * 跳转到权限设置界面 */ public static void toAppSetting(Context context) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 9) { intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); } else if (Build.VERSION.SDK_INT <= 8) { intent.setAction(Intent.ACTION_VIEW); intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); intent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName()); } context.startActivity(intent); } public interface PermissionRequestSuccessCallBack { /** * 用户已授予权限 */ void onHasPermission(); } public interface PermissionCheckCallBack { /** * 用户已授予权限 */ void onHasPermission(); /** * 用户已拒绝过权限 * * @param permission:被拒绝的权限 */ void onUserHasAlreadyTurnedDown(String... permission); /** * 用户已拒绝过并且已勾选不再询问选项、用户第一次申请权限; * * @param permission:被拒绝的权限 */ void onUserHasAlreadyTurnedDownAndDontAsk(String... permission); } } 

工具类及Demo:github

转载于:https://www.cnblogs.com/Im-Victor/p/9644568.html


http://www.niftyadmin.cn/n/1791404.html

相关文章

Java_基础_线程状态图

~转载于:https://www.cnblogs.com/donghailang/p/6400679.html

电商RPA教你玩转商品上下架

随着新型电商的顺势崛起&#xff0c;传统电商在运营方面似乎显得有些乏力&#xff0c;要不就是效率低成本高&#xff0c;要不就是缺乏人手。就拿简简单单的商品上下架来说&#xff0c;传统电商在其中也要花费大量的时间人力成本&#xff0c;可以说是得不偿失。 很多朋友都认为…

Python语音交互的实现

实现前提 在windows10上运行的测试内容。 Python版本&#xff1a;Python3.6.2。 已经注册并添加了百度的’语音识别和语音合成应用。 已经注册并创建了图灵机器人的机器人。 整体的实现流程 语音输入。语音翻译成文字。聊天回应文字。将文字合成语音。输出语音。实现方式 pyaud…

Python B2 Function

s1I am {0},age {1}.format(chengc,18) print(s1) s2I am {0},age {1}.format(*[cc,32,]) print(s2) s3I am {name},age {age}.format(namecc,age21) print(s3) s4I am {name},age {age}.format(**{name:chengc,age:17}) print(s4)报错了&#xff01;说明&#xff1a;作用域中&…

实在智能电商RPA,一款广泛应用于电商行业的RPA机器人

受疫情影响&#xff0c;线上对线下渠道的替代逐渐加剧。随着大量实体店涌向电商赛道&#xff0c;越来越多的零售商开始转向线上&#xff0c;电商行业竞争可以说是越来越激烈。2021年传统电商可以将就着过&#xff0c;但随着新兴电商不断崛起&#xff0c;传统电商被层层压制&…

实在智能RPA机器人带你了解人工智能的前世今生

近年来&#xff0c;计算机科学领域人们谈论话题最多的就是人工智能&#xff0c;那么到底什么是人工智能呢&#xff1f;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用…

用 python 爬取 gutenberg 上的英文科幻小说

gutenberg地址&#xff1a;http://www.gutenberg.org/ 前记&#xff1a;对象的作业是翻译还没有被翻译过的英文科幻小说。百度搜索无望&#xff0c;借助了伟大的python和伟大的gutenberg下载了1000多篇英文科幻小说。下一步希望能通过程序判断这些文章是否被翻译过。 学习到的内…

后台面试类型总结

Java基础 基础java中高级芋道源码综合反射面试题java面试题算法 BAT算法综合 Spring框架 知识点: 事务机制 Spring面试题后端开发面试题阿里电面试题JVM 多线程 异步IO Netty数据库相关 MySQLmysqlmysqlHibernateMybatis数据库锁计算机网络 设计模式 单例模式工厂模式观察者模式…