android 权限申请封装类
权限请求封装代码
PermissionUtils
/*** Android 6.0+ 动态权限工具类* 支持:单个/多个权限请求、权限检查、引导用户去设置页开启权限*/
package com.nyw.mvvmmode.utils;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.provider.Settings;import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;/*** Android 6.0+ 动态权限工具类* 支持:单个/多个权限请求、权限检查、引导用户去设置页开启权限*/
public class PermissionUtils {// 权限请求码(自定义,确保唯一)public static final int REQUEST_CODE_PERMISSION = 100;// 跳转到应用设置页的请求码public static final int REQUEST_CODE_SETTINGS = 101;// 新增:使用弱引用持有Activity,避免内存泄漏private static WeakReference<Activity> sActivityWeakRef;/*** 检查单个权限是否已授予*/public static boolean checkSinglePermission(Context context, @NonNull String permission) {// Android 6.0 以下默认授予所有权限if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {return true;}return ContextCompat.checkSelfPermission(context, permission)== PackageManager.PERMISSION_GRANTED;}/*** 检查多个权限是否已全部授予*/public static boolean checkMultiplePermissions(Context context, @NonNull String[] permissions) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || permissions == null || permissions.length == 0) {return true;}for (String permission : permissions) {if (!checkSinglePermission(context, permission)) {return false;}}return true;}/*** 筛选出未授予的权限*/public static List<String> getDeniedPermissions(Context context, @NonNull String[] permissions) {List<String> deniedPermissions = new ArrayList<>();if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || permissions == null || permissions.length == 0) {return deniedPermissions;}for (String permission : permissions) {if (!checkSinglePermission(context, permission)) {deniedPermissions.add(permission);}}return deniedPermissions;}/*** 请求单个权限*/public static void requestSinglePermission(Activity activity, @NonNull String permission) {requestMultiplePermissions(activity, new String[]{permission});}/*** 请求多个权限*/public static void requestMultiplePermissions(Activity activity, @NonNull String[] permissions) {if (activity == null || permissions == null || permissions.length == 0) {return;}// 弱引用持有ActivitysActivityWeakRef = new WeakReference<>(activity);// 筛选未授予的权限List<String> deniedPermissions = getDeniedPermissions(activity, permissions);if (deniedPermissions.isEmpty()) {// 所有权限已授予,直接回调成功if (sPermissionCallback != null) {sPermissionCallback.onPermissionGranted(permissions);}return;}// 发起权限请求ActivityCompat.requestPermissions(activity,deniedPermissions.toArray(new String[0]),REQUEST_CODE_PERMISSION);}/*** 检查是否需要显示权限说明(用户之前拒绝过权限)*/public static boolean shouldShowPermissionRationale(Activity activity, @NonNull String permission) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || activity == null) {return false;}return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);}/*** 跳转到应用设置页(用户永久拒绝权限时调用)*/public static void goToAppSettings(Activity activity) {if (activity == null) {return;}Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", activity.getPackageName(), null);intent.setData(uri);activity.startActivityForResult(intent, REQUEST_CODE_SETTINGS);}// ====================== 权限请求回调 ======================private static PermissionCallback sPermissionCallback;public interface PermissionCallback {/*** 所有请求的权限都已授予*/void onPermissionGranted(String[] grantedPermissions);/*** 部分/全部权限被拒绝*/void onPermissionDenied(String[] deniedPermissions, boolean isPermanentlyDenied);}/*** 设置权限请求回调(需在请求权限前设置)*/public static void setPermissionCallback(PermissionCallback callback) {sPermissionCallback = callback;}/*** 清除权限回调(避免内存泄漏)*/public static void clearPermissionCallback() {sPermissionCallback = null;sActivityWeakRef = null; // 清除弱引用}/*** 在 Activity 的 onRequestPermissionsResult 中调用,处理权限请求结果*/public static void onRequestPermissionsResult(Activity activity, int requestCode,@NonNull String[] permissions, @NonNull int[] grantResults) {// 检查Activity是否存活if (activity == null || activity.isFinishing() || activity.isDestroyed()) {clearPermissionCallback();return;}// 检查弱引用是否有效if (sActivityWeakRef != null && sActivityWeakRef.get() != activity) {clearPermissionCallback();return;}if (requestCode != REQUEST_CODE_PERMISSION || sPermissionCallback == null) {return;}List<String> grantedPermissions = new ArrayList<>();List<String> deniedPermissions = new ArrayList<>();boolean isPermanentlyDenied = false;for (int i = 0; i < permissions.length; i++) {if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {grantedPermissions.add(permissions[i]);} else {deniedPermissions.add(permissions[i]);// 检查是否永久拒绝(用户勾选了“不再询问”)if (!shouldShowPermissionRationale(activity, permissions[i])) {isPermanentlyDenied = true;}}}if (deniedPermissions.isEmpty()) {// 所有权限都授予sPermissionCallback.onPermissionGranted(grantedPermissions.toArray(new String[0]));} else {// 部分/全部权限被拒绝sPermissionCallback.onPermissionDenied(deniedPermissions.toArray(new String[0]), isPermanentlyDenied);}}
}