当前位置: 首页 > news >正文

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);}}
}

http://www.dtcms.com/a/419830.html

相关文章:

  • 个人习惯的各类chat大模型的使用场景
  • 济南网站建设与优化网站建设验收报告范本
  • 汕头网页设计网站方案网络下载的网站模板能直接上传到虚拟主机
  • C++ 异步任务详解:future, promise, async
  • 【MySQL 高阶】MySQL 程序详解
  • Cloudreve 性能卡顿?对接雨云对象存储,实现上传下载“满速飞”
  • 解锁机器人导航的全模态潜能!OmniVLA:机器人导航的全模态视觉-语言-动作模型
  • 制作一个买股票的网站怎么做网站空间与服务器
  • java-IO流-字节流
  • 为什么要学习C编程?
  • 外贸网站建设书籍东南亚营销型网站建设与网络推广
  • 烟台市政建设招标网站自己电脑做网站必须装jdk
  • 基于IMX6ULL芯片--I2C总线简单应用
  • 360网站卫士代备案流程推广员是什么工作
  • 特别分享:LangChain——构建强大LLM应用的“万能胶水”
  • 硬件开发2-ARM裸机开发3-I.MX6ULL - 时钟、定时器
  • Information Fusion | Modal-NexT:统一的多模态细胞数据整合
  • 医院信息化建设网站梵克雅宝手链
  • seo建站的步骤刷关键词排名
  • 初识网站开发流程图石家庄新闻发布会直播
  • 网站推广在哪些平台做外链微商刚起步怎么找客源
  • 怎样做化妆品公司网站wordpress 免费企业网站 模板下载
  • 禅道 v21.7.5 Docker 一键部署
  • 外国大气网站手机网站建设多钱
  • 数据库缓存双写一致性的实现方案
  • 做网站的需求调研深圳品牌营销咨询公司
  • 网站建设一般做什么网络营销方案设计心得
  • NXP MPC5777M LINFlexD 模块配置为 UART 模式详解(基于 PowerPC 架构)
  • 商务网站主页设计公司沈阳世纪兴网站制作
  • 织梦做网站主页容易吗怎么建立自己的网站平台多少钱