判断是否授权CheckPermisionUtil工具类

2024-08-31 23:18

本文主要是介绍判断是否授权CheckPermisionUtil工具类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为AppOpsManager方法public int checkOp(int op, int uid, String packageName)是隐藏的,所以需要反射进行来调用该方法,然后传入相应权限参数,可以判断是否已经授权,比如源码中就是读写短信的2个例子

  /** @hide */public static final int OP_READ_SMS = 14;/** @hide */public static final int OP_WRITE_SMS = 15;


CheckPermisionUtil

package com.example.permission;import java.lang.reflect.Method;import android.annotation.SuppressLint;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
import android.os.Process;
import android.provider.Settings;
import android.util.Log;public class CheckPermisionUtil {private static final String[] type = { "int", "int", "string" };/*** 反射方法获取返回值结果 public int checkOp(int op, int uid, String packageName)*/@SuppressLint("InlinedApi")private static int getPermisionResult(Context context, int permValue,String methodName) {int check = 0;try {AppOpsManager aom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);Class<? extends AppOpsManager> c = aom.getClass();Class<?> paramsTypes[] = ReflectUtil.getMethodClass(type);Method method = c.getMethod(methodName, paramsTypes);String[] params = { "" + permValue, "" + Process.myUid(),context.getPackageName() };Object arglist[] = ReflectUtil.getMethodObject(type, params);check = (Integer) method.invoke(aom, arglist);} catch (Exception e) {e.printStackTrace();Log.i("TAG", "--->getPermisionResult exception");}return check;}/*** 判断某个权限是否被授权*/@SuppressLint("InlinedApi")public static boolean isPermisionGranted(Context context, int permValue) {boolean result = true;switch (getPermisionResult(context, permValue, "checkOp")) {case AppOpsManager.MODE_IGNORED:// 被禁止掉result = false;break;default:result = true;// 允许和需要确认不需要做什么操作,故都返回truebreak;}return result;}/*** 打开系统安全设置界面*/public static void openSecurityPager(Context context) {openSystemPager(context, Settings.ACTION_SECURITY_SETTINGS);}/*** 打开设置界面*/public static void openSettingPager(Context context) {openSystemPager(context, Settings.ACTION_SETTINGS);}/*** 打开系统界面*/public static void openSystemPager(Context context, String action) {Intent intent = new Intent();intent.setAction(action);context.startActivity(intent);}/*** 检测短信编写权限是否被许可*/public static boolean isSmsWritePermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_WRITE_SMS);}/*** 检测短信接收权限是否被许可*/public static boolean isSmsReceivePermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_RECEIVE_SMS);}/*** 检测短信读取权限是否被许可*/public static boolean isSmsReadPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_READ_SMS);}/*** 检测短信发送是否被许可*/public static boolean isSmsSendPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_SEND_SMS);}/*** 检测打开相机权限是否被许可*/public static boolean isCameraPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_CAMERA);}/*** 检测悬浮窗权限是否被许可*/public static boolean isFloatWindowPermisionGranted(Context context) {return isPermisionGranted(context,PermisionValue.OP_SYSTEM_ALERT_WINDOW);}/*** 检测读取联系人权限是否被许可*/public static boolean isReadContactPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_READ_CONTACTS);}/*** 检测添加联系人权限是否被许可*/public static boolean isWriteContactPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_WRITE_CONTACTS);}/*** 检测直接拨号权限是否被许可(无界面拨号)*/public static boolean isCallPhonePermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_CALL_PHONE);}/*** 检测录制音频权限是否被许可*/public static boolean isRecordAudioPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_RECORD_AUDIO);}/*** 检测读取通话记录权限是否被许可*/public static boolean isReadCallLogPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_READ_CALL_LOG);}/*** 检测编写通话记录权限是否被许可*/public static boolean isWriteCallLogPermisionGranted(Context context) {return isPermisionGranted(context, PermisionValue.OP_WRITE_CALL_LOG);}}

PermisionValue

package com.example.permission;import java.util.HashMap;
import java.util.Map;public class PermisionValue {public static final Map<Integer, String> permisionMap = new HashMap<Integer, String>();public static final int OP_GRANTED = 0X01;//许可public static final int OP_NO_GRANTED = 0X02;//禁止public static final int OP_UNSURE_GRANTED = 0X03;//需要确认public static final int OP_READ_CONTACTS = 4;public static final int OP_WRITE_CONTACTS = 5;public static final int OP_READ_CALL_LOG = 6;public static final int OP_WRITE_CALL_LOG = 7;public static final int OP_CALL_PHONE = 13;public static final int OP_READ_SMS = 14;public static final int OP_WRITE_SMS = 15;public static final int OP_RECEIVE_SMS = 16;public static final int OP_SEND_SMS = 20;public static final int OP_SYSTEM_ALERT_WINDOW = 24;public static final int OP_CAMERA = 26;public static final int OP_RECORD_AUDIO = 27;public static final int OP_PLAY_AUDIO = 28;static{permisionMap.put(OP_GRANTED, "");permisionMap.put(OP_WRITE_SMS, "编辑短信权限");permisionMap.put(OP_RECEIVE_SMS, "接收短信权限");permisionMap.put(OP_READ_SMS, "读取短信权限");permisionMap.put(OP_SEND_SMS, "发送短信权限");permisionMap.put(OP_CAMERA, "拍照权限");permisionMap.put(OP_SYSTEM_ALERT_WINDOW, "悬浮窗权限");permisionMap.put(OP_READ_CONTACTS, "读取联系人权限");permisionMap.put(OP_WRITE_CONTACTS, "添加联系人权限");permisionMap.put(OP_CALL_PHONE, "拨号权限");permisionMap.put(OP_RECORD_AUDIO, "录音权限");permisionMap.put(OP_READ_CALL_LOG, "读取通话记录权限");permisionMap.put(OP_WRITE_CALL_LOG, "修改通话记录权限");}}

以上只是列出了一部分,AppOpsManager中可以去查看有哪些权限


ReflectUtil

package com.example.permission;import android.annotation.SuppressLint;public class ReflectUtil {// 获取参数类型Class[]的方法@SuppressWarnings("rawtypes")public static Class[] getMethodClass(String[] type) {Class[] cs = new Class[type.length];for (int i = 0; i < cs.length; i++) {if (!type[i].trim().equals("") || type[i] != null) {if (type[i].equals("int") || type[i].equals("Integer")) {cs[i] = Integer.TYPE;} else if (type[i].equals("float") || type[i].equals("Float")) {cs[i] = Float.TYPE;} else if (type[i].equals("double") || type[i].equals("Double")) {cs[i] = Double.TYPE;} else if (type[i].equals("boolean") || type[i].equals("Boolean")) {cs[i] = Boolean.TYPE;} else {cs[i] = String.class;}}}return cs;}// 获取参数Object[]的方法@SuppressLint("UseValueOf")public static Object[] getMethodObject(String[] type, String[] param) {Object[] obj = new Object[param.length];for (int i = 0; i < obj.length; i++) {if (!param[i].trim().equals("") || param[i] != null) {if (type[i].equals("int") || type[i].equals("Integer")) {obj[i] = new Integer(param[i]);} else if (type[i].equals("float") || type[i].equals("Float")) {obj[i] = new Float(param[i]);} else if (type[i].equals("double") || type[i].equals("Double")) {obj[i] = new Double(param[i]);} else if (type[i].equals("boolean") || type[i].equals("Boolean")) {obj[i] = new Boolean(param[i]);} else {obj[i] = param[i];}}}return obj;}
}

MainActivity

package com.example.permission;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);CheckPermisionUtil.openSecurityPager(this);CheckPermisionUtil.openSettingPager(this);boolean isSmsWritePermisionGranted = CheckPermisionUtil.isSmsWritePermisionGranted(this);boolean isSmsReceivePermisionGranted = CheckPermisionUtil.isSmsReceivePermisionGranted(this);boolean isSmsReadPermisionGranted = CheckPermisionUtil.isSmsReadPermisionGranted(this);boolean isSmsSendPermisionGranted = CheckPermisionUtil.isSmsSendPermisionGranted(this);boolean isCameraPermisionGranted = CheckPermisionUtil.isCameraPermisionGranted(this);boolean isFloatWindowPermisionGranted = CheckPermisionUtil.isFloatWindowPermisionGranted(this);boolean isReadContactPermisionGranted = CheckPermisionUtil.isReadContactPermisionGranted(this);boolean isWriteContactPermisionGranted = CheckPermisionUtil.isWriteContactPermisionGranted(this);boolean isCallPhonePermisionGranted = CheckPermisionUtil.isCallPhonePermisionGranted(this);boolean isRecordAudioPermisionGranted = CheckPermisionUtil.isRecordAudioPermisionGranted(this);boolean isReadCallLogPermisionGranted = CheckPermisionUtil.isReadCallLogPermisionGranted(this);boolean isWriteCallLogPermisionGranted = CheckPermisionUtil.isWriteCallLogPermisionGranted(this);Log.i("TAG", "isSmsWritePermisionGranted:"+isSmsWritePermisionGranted);Log.i("TAG", "isSmsReceivePermisionGranted:"+isSmsReceivePermisionGranted);Log.i("TAG", "isSmsReadPermisionGranted:"+isSmsReadPermisionGranted);Log.i("TAG", "isSmsSendPermisionGranted:"+isSmsSendPermisionGranted);Log.i("TAG", "isCameraPermisionGranted:"+isCameraPermisionGranted);Log.i("TAG", "isFloatWindowPermisionGranted:"+isFloatWindowPermisionGranted);Log.i("TAG", "isReadContactPermisionGranted:"+isReadContactPermisionGranted);Log.i("TAG", "isWriteContactPermisionGranted:"+isWriteContactPermisionGranted);Log.i("TAG", "isCallPhonePermisionGranted:"+isCallPhonePermisionGranted);Log.i("TAG", "isRecordAudioPermisionGranted:"+isRecordAudioPermisionGranted);Log.i("TAG", "isReadCallLogPermisionGranted:"+isReadCallLogPermisionGranted);Log.i("TAG", "isWriteCallLogPermisionGranted:"+isWriteCallLogPermisionGranted);}}


这篇关于判断是否授权CheckPermisionUtil工具类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125277

相关文章

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

sqlite3 命令行工具使用指南

《sqlite3命令行工具使用指南》本文系统介绍sqlite3CLI的启动、数据库操作、元数据查询、数据导入导出及输出格式化命令,涵盖文件管理、备份恢复、性能统计等实用功能,并说明命令分类、SQL语... 目录一、启动与退出二、数据库与文件操作三、元数据查询四、数据操作与导入导出五、查询输出格式化六、实用功

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基