android 自定义封装android 6.0以上动态权限添加工具类
16lz
2021-01-23
android 自定义封装android 6.0以上动态权限添加工具类
android开发过程中,动态权限添加时避免不了的,我看过别的添加权限的好多文章,但大多数添加的过程太过臃肿,代码量大。很不合理,于是乎,自己封装了一个工具类。很简单,来上代码。
package com.example.zsh.sendmessagedemo;import android.app.Activity;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Build;import android.provider.Settings;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AlertDialog;import java.util.ArrayList;import java.util.List;public class PermissionTool { private final int mRequestCode = 100;//权限请求码 public static boolean showSystemSetting = true; private PermissionTool() { } private static PermissionTool permissionsUtils; private IPermissionsResult mPermissionsResult; public static PermissionTool getInstance() { if (permissionsUtils == null) { permissionsUtils = new PermissionTool(); } return permissionsUtils; } public void chekPermissions(Activity context, String[] permissions, @NonNull IPermissionsResult permissionsResult) { mPermissionsResult = permissionsResult; if (Build.VERSION.SDK_INT < 23) {//6.0才用动态权限 permissionsResult.passPermissons(); return; } //创建一个mPermissionList,逐个判断哪些权限未授予,未授予的权限存储到mPerrrmissionList中 List mPermissionList = new ArrayList<>(); //逐个判断你要的权限是否已经通过 for (int i = 0; i < permissions.length; i++) { if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) { mPermissionList.add(permissions[i]);//添加还未授予的权限 } } //申请权限 if (mPermissionList.size() > 0) {//有权限没有通过,需要申请 ActivityCompat.requestPermissions(context, permissions, mRequestCode); } else { //说明权限都已经通过,可以做你想做的事情去 permissionsResult.passPermissons(); return; } } //请求权限后回调的方法 //参数: requestCode 是我们自己定义的权限请求码 //参数: permissions 是我们请求的权限名称数组 //参数: grantResults 是我们在弹出页面后是否允许权限的标识数组,数组的长度对应的是权限名称数组的长度,数组的数据0表示允许权限,-1表示我们点击了禁止权限 public void onRequestPermissionsResult(Activity context, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { boolean hasPermissionDismiss = false;//有权限没有通过 if (mRequestCode == requestCode) { for (int i = 0; i < grantResults.length; i++) { if (grantResults[i] == -1) { hasPermissionDismiss = true; } } //如果有权限没有被允许 if (hasPermissionDismiss) { if (showSystemSetting) { showSystemPermissionsSettingDialog(context);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问 } else { mPermissionsResult.forbitPermissons(); } } else { //全部权限通过,可以进行下一步操作。。。 mPermissionsResult.passPermissons(); } } } /** * 不再提示权限时的展示对话框 */ AlertDialog mPermissionDialog; private void showSystemPermissionsSettingDialog(final Activity context) { final String mPackName = context.getPackageName(); if (mPermissionDialog == null) { mPermissionDialog = new AlertDialog.Builder(context) .setMessage("已禁用权限,请手动授予") .setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { cancelPermissionDialog(); Uri packageURI = Uri.parse("package:" + mPackName); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI); context.startActivity(intent); context.finish(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //关闭页面或者做其他操作 cancelPermissionDialog(); //mContext.finish(); mPermissionsResult.forbitPermissons(); } }) .create(); } mPermissionDialog.show(); } //关闭对话框 private void cancelPermissionDialog() { if (mPermissionDialog != null) { mPermissionDialog.cancel(); mPermissionDialog = null; } } public interface IPermissionsResult { void passPermissons(); void forbitPermissons(); }}
用的时候直接调用,如下:
// 把需要的权限添加到String[]数组中即可 PermissionTool.getInstance().chekPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA, Manifest.permission.WRITE_CALENDAR, Manifest.permission.CALL_PHONE, Manifest.permission.SEND_SMS, Manifest.permission.RECORD_AUDIO}, new PermissionTool.IPermissionsResult() { @Override public void passPermissons() {// 通过权限的操作 } @Override public void forbitPermissons() {// 拒绝权限的操作 } }); }
更多相关文章
- Android EasyPermissions官方库,高效处理权限
- Android小例子(点击一个按钮,传递数据给另一个页面)
- 转:Android中如何修改系统时间(应用程序获得系统权限)
- Android让页面默认弹出输入法的问题
- Android之——申请应用系统管理员权限
- android selinux权限, Permission denied, 访问限制
- [Android--Structure]App系统权限permission与安全security