【笔记】Android6.0之后权限请求工具类
来源:互联网 发布:win10网络凭证 编辑:程序博客网 时间:2024/06/03 16:38
android6.0开始对权限的管理越来越严格,权限请求非常烦躁,是要通过一个请求权限requestPermissions、一个权限请求回调onRequestPermissionsResult以及一个显示权限请求解释shouldShowRequestPermissionRationale。
我将权限请求封装成了工具类的形式,使用过程中还是在需要使用到权限的地方使用requestPermissions,在回调中调用onRequestPermissionsResult,中间通过一个静态map存储请求的权限数组和requestCode。
个人感觉对于一般使用已经是足够了,除非遇到连续请求权限,但是如果真的需要连续请求多个权限,直接放进一个数组就行。
public class PermisstionUtil { private static final String TAG = "PermisstionUtil"; private static HashMap<String, Object> map = new HashMap<String, Object>(); /** * 版本检测 * @return */ private static boolean checkSDK() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; } /** * 权限请求 * * @param context * @param permissions 需要请求的权限 * @param requestCode * @param explainMsg 权限解释 * @param onPermissionResult */ public static void requestPermissions(@NonNull Context context, @NonNull String[] permissions, int requestCode, String explainMsg, OnPermissionResult onPermissionResult) { onPermissionResult = initOnPermissionResult(onPermissionResult, permissions, requestCode, explainMsg); if (permissions.length == 0) { invokeOnRequestPermissionsResult(context, onPermissionResult); } else if (context instanceof Activity || (Object) context instanceof Fragment) { if (checkSDK()) { onPermissionResult.deniedPermissions = getDeniedPermissions(context, permissions); if (onPermissionResult.deniedPermissions.length > 0) {//存在被拒绝的权限 onPermissionResult.rationalePermissions = getRationalePermissions(context, onPermissionResult.deniedPermissions); if (onPermissionResult.rationalePermissions.length > 0) {//向用户解释请求权限的理由 shouldShowRequestPermissionRationale(context, onPermissionResult); } else { invokeRequestPermissions(context, onPermissionResult); } } else {//所有权限允许 onPermissionResult.grantResults = new int[permissions.length]; for (int i = 0; i < onPermissionResult.grantResults.length; i++) { onPermissionResult.grantResults[i] = PackageManager.PERMISSION_GRANTED; } invokeOnRequestPermissionsResult(context, onPermissionResult); } } else { onPermissionResult.grantResults = getPermissionsResults(context, permissions); invokeOnRequestPermissionsResult(context, onPermissionResult); } } } /** * 获取被拒绝的权限 * * @param context * @param permissions * @return */ private static String[] getDeniedPermissions(Context context, String[] permissions) { List<String> list = new ArrayList<String>(); for (String permission : permissions) { if (checkPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { list.add(permission); } } return list.toArray(new String[list.size()]); } /** * 获取权限请求结果 * * @param context * @param permissions * @return */ private static int[] getPermissionsResults(Context context, String[] permissions) { int[] results = new int[permissions.length]; for (int i = 0; i < results.length; i++) { results[i] = checkPermission(context, permissions[i]); } return results; } private static String[] getRationalePermissions(Context context, String[] deniedPermissions) { List<String> list = new ArrayList<String>(); for (String permission : deniedPermissions) { if (context instanceof Activity) { if (((Activity) context).shouldShowRequestPermissionRationale(permission)) { list.add(permission); } } else if ((Object) context instanceof Fragment) { if (((Fragment) (Object) context).shouldShowRequestPermissionRationale(permission)) { list.add(permission); } } else { throw new IllegalArgumentException("context 只能是Activity或Fragment"); } } return list.toArray(new String[list.size()]); } /** * 调用权限请求方法 * * @param context * @param onPermissionResult */ private static void invokeRequestPermissions(Context context, OnPermissionResult onPermissionResult) { if (context instanceof Activity) ((Activity) context).requestPermissions(onPermissionResult.deniedPermissions, onPermissionResult.requestCode); else if ((Object) context instanceof Fragment) ((Fragment) (Object) context).requestPermissions(onPermissionResult.deniedPermissions, onPermissionResult.requestCode); } /** * 调用权限请求结果回调 * * @param context * @param onPermissionResult */ private static void invokeOnRequestPermissionsResult(Context context, OnPermissionResult onPermissionResult) { if (context instanceof Activity) { if (checkSDK()) { ((Activity) context).onRequestPermissionsResult(onPermissionResult.requestCode, onPermissionResult.permissions, onPermissionResult.grantResults); } else if (context instanceof ActivityCompat.OnRequestPermissionsResultCallback) { ((ActivityCompat.OnRequestPermissionsResultCallback) context).onRequestPermissionsResult(onPermissionResult.requestCode, onPermissionResult.permissions, onPermissionResult.grantResults); } else { onRequestPermissionsResult(onPermissionResult.requestCode, onPermissionResult.permissions, onPermissionResult.grantResults); } } else if ((Object) context instanceof Fragment) { ((Fragment) (Object) context).onRequestPermissionsResult(onPermissionResult.requestCode, onPermissionResult.permissions, onPermissionResult.grantResults); } } /** * 显示权限解释 * * @param context * @param onPermissionResult */ private static void shouldShowRequestPermissionRationale(final Context context, final OnPermissionResult onPermissionResult) { new AlertDialog.Builder(context instanceof Activity ? context : ((Fragment) (Object) context).getActivity()) .setTitle("提示") .setMessage(onPermissionResult.explainMsg) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); invokeRequestPermissions(context, onPermissionResult); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); onPermissionResult.grantResults = getPermissionsResults(context, onPermissionResult.permissions); invokeOnRequestPermissionsResult(context, onPermissionResult); } }).show(); } /** * 检查权限 * * @param context * @param permission * @return */ private static int checkPermission(Context context, String permission) { return context.checkPermission(permission, Process.myPid(), Process.myUid()); } /** * 权限请求结果 * * @param requestCode * @param permissions * @param grantResults */ public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { synchronized (TAG) { OnPermissionResult onPermissionResult = (OnPermissionResult) map.get(String.valueOf(requestCode)); if (onPermissionResult != null) { List<String> deniedPermissions = new ArrayList<String>(); for (int i = 0; i < grantResults.length; i++) { if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { deniedPermissions.add(permissions[i]); } } if (deniedPermissions.size() > 0) { onPermissionResult.denied(requestCode); } else { onPermissionResult.granted(requestCode); } map.remove(String.valueOf(requestCode)); } } } /** * 初始化权限请求回调 * * @param onPermissionResult * @param permissions * @param requestCode * @param explainMsg @return */ private static OnPermissionResult initOnPermissionResult(OnPermissionResult onPermissionResult, String[] permissions, int requestCode, String explainMsg) { synchronized (TAG) { if (onPermissionResult == null) { onPermissionResult = new OnPermissionResult() { @Override public void granted(int requestCode) { } @Override public void denied(int requestCode) { } }; } onPermissionResult.permissions = permissions; onPermissionResult.requestCode = requestCode; onPermissionResult.explainMsg = explainMsg; onPermissionResult.grantResults = new int[0]; map.put(String.valueOf(requestCode), onPermissionResult); return onPermissionResult; } } public abstract static class OnPermissionResult { int requestCode; String explainMsg; String[] permissions; String[] deniedPermissions; String[] rationalePermissions; int[] grantResults; //权限允许 public abstract void granted(int requestCode); //权限拒绝 public abstract void denied(int requestCode); }}
0 0
- 【笔记】Android6.0之后权限请求工具类
- Android6.0之后请求权限
- Android6.0请求权限
- android6.0以上权限申请工具类
- Android6.0手机权限处理工具类
- Android6.0权限permission提醒工具类
- android6.0动态权限申请工具类
- android6.0以上权限申请工具类
- android6.0系统之后,打开照相权限
- Android6.0之后动态权限申请
- Android6.0权限问题,并撰写常用权限工具类
- Android6.0权限问题,并撰写常用权限工具类
- android6.0以上权限动态请求实现
- Android6.0在运行时请求权限
- Android6.0权限系统以及工具类的实现
- Android6.0 权限管理工具类
- android6.0权限申请学习笔记
- Android笔记--Android6.0、7.0权限处理
- Spring 配置事务管理无效(No Session found for current thread)原因及解决方案
- [RL] 4 Dynamic Programming (1)
- POJ 3421 X-factor-Chains
- 第六届蓝桥杯九数组分数
- 博客搭建(1)--使用github搭建个人博客
- 【笔记】Android6.0之后权限请求工具类
- 魔力手环-网易互联网2017在线笔试题目
- 死锁的案例
- 安卓数据存储-使用LitePal操作数据库
- 浅谈协方差矩阵
- 如何整理个人桌面?
- 题解:Continuous Subarray Sum
- C/C++经典程序训练3---模拟计算器
- Mac上MyEclipse创建java后台程序访问MySQL本地数据库