以unity技术开发视角对android权限的讲解

目录

前言

Android权限分类

普通权限

 普通权限定义

普通权限有哪些

危险权限

 危险权限的定义

危险权限有哪些 

动态申请权限实例

申请单个权限实例

第一步:在清单文件中声明权限

 第二步:在代码中进行动态申请权限

申请多个权限实例

第一步:在清单文件中声明权限

第二步:在代码中进行动态申请权限


前言

        在unity开发过程中,接SDK的时候有一个问题是绕不开,那就是合规问题,早期的时候对于权限设置和获取并没有那么多限制,或者说规范吧。现如今随着合规越来越严格,对于unity游戏开发人员对于android的权限有一些大致了解还是有其必要性,尤其是需要接SDK的小朋友而言,更是如此。这里就简约讲解下android有哪些权限分类,同时如何在运行时申请权限。由于android开发并不是我的主要技术防线,所以这里只做一个简单的知识普及而已。

Android权限分类

        普通权限(安装时权限

        危险权限(运行时权限

        特殊权限  (一般属于系统层面,这里就不作叙述)

普通权限

 普通权限定义

不需要动态请求用户授权,只需要在AndroidManifest.xml中声明即可的权限。  此类权限允许访问超出应用沙盒的数据和执行超出应用沙盒的操作,但对用户隐私和其他应用的运行构成的风险很小。系统会为一般权限分配 normal 保护级别。

例如: 网络访问(魅族系统进行了魔改,网络权限也需要申请)、WIFI状态、音量设置等。

如:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapp"android:versionCode="1"android:versionName="1.0"><!-- 定义应用程序的权限 --><!-- 运用获取网络状态权限--><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 定义应用程序的 Application 类 --><application...省略</application>
</manifest>

普通权限有哪些

ACCESS_CHECKIN_PROPERTIES:读取和写入“properties”表在checkin数据库中
ACCESS_LOCATION_EXTRA_COMMANDS:访问额外的位置提供命令
ACCESS_NETWORK_STATE:获取网络信息状态
ACCESS_NOTIFICATION_POLICY:希望访问通知策略的应用程序的标记许可
ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
ACCOUNT_MANAGER:通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息
BATTERY_STATS:更新手机电池统计信息
BIND_ACCESSIBILITY_SERVICE:请求accessibilityservice服务
BIND_APPWIDGET:告诉appWidget服务需要访问小插件的数据库
BIND_CARRIER_MESSAGING_SERVICE:绑定到运营商应用程序中的服务
BIND_CARRIER_SERVICES:绑定到运营商应用程序中的服务
BIND_CHOOSER_TARGET_SERVICE:由ChooserTargetService要求的服务
BIND_DEVICE_ADMIN:请求系统管理员receiver
BIND_DREAM_SERVICE:由一个DreamService要求的服务
BIND_INCALL_SERVICE:请求MidiDeviceService服务
BIND_INPUT_METHOD:请求InputMethodService服务
BIND_MIDI_DEVICE_SERVICE:由一MidiDeviceService要求的服务
BIND_NFC_SERVICE:由HostApduServiceOffHostApduService要求的服务
BIND_NOTIFICATION_LISTENER_SERVICE:由notificationlistenerservice要求的服务
BIND_PRINT_SERVICE:由printservice要求的服务
BIND_REMOTEVIEWS:通过RemoteViewsService服务请求
BIND_TELECOM_CONNECTION_SERVICE:由ConnectionService要求的服务
BIND_TEXT_SERVICE:由textservice要求的服务
BIND_TV_INPUT:由TvInputService要求的服务
BIND_VOICE_INTERACTION:由VoiceInteractionService要求的服务
BIND_VPN_SERVICE:通过VpnService服务请求
BIND_WALLPAPER:通过WallpaperService服务请求
BLUETOOTH:连接配对过的蓝牙设备
BLUETOOTH_ADMIN:发现和配对新的蓝牙设备
BLUETOOTH_PRIVILEGED:配对蓝牙设备,无需用户交互
BROADCAST_PACKAGE_REMOVED:广播一个提示消息在一个应用程序包已经移除后
BROADCAST_SMS:当收到短信时触发广播
BROADCAST_STICKY:收到广播后快速收到下一个广播
BROADCAST_WAP_PUSH:WAP PUSH服务收到后触发广播
CALL_PRIVILEGED:拨打电话,替换系统的拨号器界面
CAPTURE_AUDIO_OUTPUT:捕获音频输出
CAPTURE_SECURE_VIDEO_OUTPUT:捕获视频输出
CAPTURE_VIDEO_OUTPUT:捕获视频输出
CHANGE_COMPONENT_ENABLED_STATE:改变组件是否启用状态
CHANGE_CONFIGURATION:改变配置信息
CHANGE_NETWORK_STATE:改变网络状态,如是否联网
CHANGE_WIFI_MULTICAST_STATE:改变WiFi多播状态
CHANGE_WIFI_STATE:改变WiFi状态
CLEAR_APP_CACHE:清除应用缓存
CONTROL_LOCATION_UPDATES:获得移动网络定位信息
DELETE_CACHE_FILES:删除缓存文件
DELETE_PACKAGES:删除应用
DIAGNOSTIC:RW到诊断资源
DISABLE_KEYGUARD:禁用键盘锁
DUMP:获取系统dump信息
EXPAND_STATUS_BAR:扩展或收缩状态栏
FACTORY_TEST:运行工厂测试模式
FLASHLIGHT:访问闪光灯
GET_ACCOUNTS_PRIVILEGED:访问帐户服务中的帐户列表
GET_PACKAGE_SIZE:获取任何package占用空间容量
GET_TASKS:获取信息有关当前或最近运行的任务
GLOBAL_SEARCH:允许全局搜索
INSTALL_LOCATION_PROVIDER:安装定位提供
INSTALL_PACKAGES:安装应用
INSTALL_SHORTCUT:创建快捷方式
INTERNET:访问网络连接
KILL_BACKGROUND_PROCESSES:结束后台进程
LOCATION_HARDWARE:使用定位功能的硬件
MANAGE_DOCUMENTS:管理文档访问
MASTER_CLEAR:执行软格式化,删除系统配置信息
MEDIA_CONTENT_CONTROL:控制播放和内容
MODIFY_AUDIO_SETTINGS:修改声音设置信息
MODIFY_PHONE_STATE:修改电话状态
MOUNT_FORMAT_FILESYSTEMS:格式化可移动文件系统
MOUNT_UNMOUNT_FILESYSTEMS:挂载、反挂载外部文件系统
NFC:执行NFC近距离通讯操作
PACKAGE_USAGE_STATS:设置他的activities显示
PERSISTENT_ACTIVITY:创建一个永久的Activity
READ_FRAME_BUFFER:读取帧缓存
READ_INPUT_STATE:读取当前键的输入状态
READ_LOGS:读取系统底层日志
READ_SYNC_SETTINGS:读取同步设置
READ_SYNC_STATS:读取同步状态
READ_VOICEMAIL:读取语音邮件
REBOOT:重新启动设备
RECEIVE_BOOT_COMPLETED:开机自动运行
REORDER_TASKS:重新排序系统Z轴运行中的任务
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS:请求忽略电池优化
REQUEST_INSTALL_PACKAGES:请求安装包
RESTART_PACKAGES:结束任务
SEND_RESPOND_VIA_MESSAGE:即时的短信息回复
SET_ALARM:设置闹铃提醒
SET_ALWAYS_FINISH:程序在后台是否总是退出
SET_ANIMATION_SCALE:设置全局动画缩放
SET_DEBUG_APP:设置调试程序
SET_PREFERRED_APPLICATIONS:设置应用的参数
SET_PROCESS_LIMIT:设置最大的进程数量的限制
SET_TIME:设置系统时间
SET_TIME_ZONE:设置系统时区
SET_WALLPAPER:设置桌面壁纸
SET_WALLPAPER_HINTS:设置壁纸建议
SIGNAL_PERSISTENT_PROCESSES:发送一个永久的进程信号
STATUS_BAR:打开、关闭、禁用状态栏
SYSTEM_ALERT_WINDOW:显示系统窗口
TRANSMIT_IR:使用设备的红外发射器
UNINSTALL_SHORTCUT:删除快捷方式
UPDATE_DEVICE_STATS:更新设备状态
USE_FINGERPRINT:使用指纹硬件
VIBRATE:允许程序振动
WAKE_LOCK :允许程序在手机屏幕关闭后后台进程仍然运行
WRITE_APN_SETTINGS:允许程序写入网络GPRS接入点设置
WRITE_GSERVICES:允许程序修改Google服务地图
WRITE_SECURE_SETTINGS:允许应用程序读取或写入安全系统设置
WRITE_SETTINGS:允许程序读取或写入系统设置 WRITE_SYNC_SETTINGS:允许程序写入同步设置
WRITE_VOICEMAIL:允许应用程序修改和删除系统中的现有的语音邮件,只有系统才能使用
 

危险权限

 危险权限的定义

        涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。

例如: 读取通讯录、访问媒体和摄像机设备、读写存储器数据、获取用户位置等。如果应用声明需要这些危险权限,则必须在运行时明确告诉用户,让用户手动授予。

危险权限有哪些 

编号权限组权限
1CALENDAR (日历)READ_CALENDAR( 读取日历
WRITE_CALENDAR(
写入日历
2CAMERA (相机)CAMERA(照相机
3CONTACTS (联系人)READ_CONTACTS(读取通讯录
WRITE_CONTACTS(
写入通讯录
GET_ACCOUNTS(
访问通讯录权限
4LOCATION (位置)ACCESS_FINE_LOCATION(获取位置
ACCESS_COARSE_LOCATION(
获取粗略定位
5MICROPHONE (麦克风)RECORD_AUDIO(录音
6PHONE (手机)READ_PHONE_STATE(读取手机状态
CALL_PHONE(
打电话
READ_CALL_LOG(
看电话记录
WRITE_CALL_LOG(
编写调用日志
ADD_VOICEMAIL(
添加语音信箱
USE_SIP(
 使用SIP
PROCESS_OUTGOING_CALLS(
 过程输出调用
7SENSORS (传感器)BODY_SENSORS(体传感器
8SMS (短信)SEND_SMS(发信息
RECEIVE_SMS(
收信息
READ_SMS(
读取信息
RECEIVE_WAP_PUSH(
收到WAP推送
RECEIVE_MMS(
接收彩信
9STORAGE (存储卡)READ_EXTERNAL_STORAGE(读取外部存储器 
WRITE_EXTERNAL_STORAGE(
写外部存储器

动态申请权限实例

申请单个权限实例

以获取获取打电话权限(CALL_PHONE)为例

第一步:在清单文件中声明权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.apple.encryptiondemo"><uses-permission android:name="android.permission.CALL_PHONE" />...

 第二步:在代码中进行动态申请权限

public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_call = findViewById(R.id.btn_call);btn_call.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//==第一步:判断用户是否已经授权//ContextCompat.checkSelfPermission() 参数一:context 参数二:具体的权限名if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {//没有授权,则申请授权//ActivityCompat.requestPermissions() 参数一:context 参数二:申请的权限名数组 参数三:请求码,要求唯一值ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);} else {call();}}});}@SuppressLint("MissingPermission")private void call() {Intent intent = new Intent(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);}//==第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {call();} else {Toast.makeText(MainActivity.this, "you denied", Toast.LENGTH_SHORT).show();}break;}}
}

申请多个权限实例

        获取打电话和扩展SD卡权限为例

第一步:在清单文件中声明权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.apple.encryptiondemo"><uses-permission android:name="android.permission.CALL_PHONE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/>

第二步:在代码中进行动态申请权限

public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_call = findViewById(R.id.btn_call);btn_call.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//第一步:看权限是否已经被申请,没有则申请权限List<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.CALL_PHONE);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.READ_PHONE_STATE);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);}if (!permissionList.isEmpty()) {String[] permissions = permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);} else {call();}}});}@SuppressLint("MissingPermission")private void call() {Intent intent = new Intent(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);}//第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();finish();return;}}call();}else{Toast.makeText(MainActivity.this, "发生未知错误", Toast.LENGTH_SHORT).show();finish();}break;}}
}

由于作者水平有限,如果有错误和不当之处,忘小伙伴指正,不胜感激!!! 

参考资料

https://www.jianshu.com/p/338741725cd0

https://developer.android.google.cn/guide/topics/permissions/overview?hl=zh_cn

https://blog.csdn.net/m0_45695811/article/details/133851898

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大众汽车宣布将ChatGPT,批量集成在多种汽车中!

1月9日&#xff0c;大众汽车在官网宣布&#xff0c;将ChatGPT批量集成到电动、内燃机汽车中。 大众表示&#xff0c;将ChatGPT与其IDA语音助手相结合&#xff0c;用户通过自然语言就能与ChatGPT进行互动&#xff0c;例如&#xff0c;帮我看看最近的三星米其林饭店在哪里&#…

8.1、5G网络切片认识篇

首先&#xff0c;3G上网时代来临&#xff0c;流量高速增长&#xff0c;但是网络资源有限&#xff0c;不可能保证所有业务都能全速进行&#xff0c;总得捡重要的首先保障&#xff0c;因此就对业务进行分类&#xff0c;给予不同优先级的业务不同的资源&#xff0c;不同的服务质量…

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价) 目录 时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 …

基于apache的http文件服务配置

背景&#xff1a; 公司的产品使用的第三方模组可以OTA&#xff0c;厂家提供的是window开启软件&#xff0c;这样就可以在本机做http下载服务器&#xff0c;然后使用端口映射的方式&#xff0c;公开到外网&#xff0c;这样就可以进行4G网络访问内网服务器了。但这个有个弊端&am…

redis 主从同步和故障切换的几个坑

数据不一致 当我们从节点读取一个数据时&#xff0c;和主节点读取的数据不一致&#xff0c;这是因为主从同步的命令是异步进行的&#xff0c;一般情况下是主从同步延迟导致的&#xff0c;为什么会延迟&#xff0c; 主要二个原因 1、网络状态不好 2、网络没问题&#xff0c;从节…

高通平台开发系列讲解(USB篇)Ubuntu 下如何使用模块

文章目录 一、查看VID、PID二、adb添加2.1、在udev下添加模块的VID2.2、重启adb服务三、虚拟串口添加(AT、Diag)沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要图解高通平台上位机使用方法 一、查看VID、PID 在ubuntu下使用模块进行AT指令发送,Diag等串…

【愚公系列】2023年12月 HarmonyOS教学课程 043-Stage模型(ExtensionAbility组件)

&#x1f3c6; 作者简介&#xff0c;愚公搬代码 &#x1f3c6;《头衔》&#xff1a;华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xf…

【Storm实战】1.1 图解Storm的抽象概念

文章目录 0. 前言1. Storm 中的抽象概念1.1 流 (Stream)1.2 拓扑 (Topology)1.3 Spout1.4 Bolt1.5 任务 (Task)1.6 工作者 (Worker) 2. 形象的理解Storm的抽象概念2.1 流 (Stream)2.2 拓扑 (Topology)2.3 Spout2.4 Bolt2.5 任务 (Task)2.6 工作者 (Worker)场景1场景2 3.参考文档…

详解CAS及ABA问题

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是 CAS 问题。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈️✈️动动…

Hex2Bin转换软件、Bootloader 、OTA加密升级 、STM32程序加密、其他MCU同样适用

说明&#xff1a;这个工具可以将 Hex 文件 转换为 Bin 格式文件&#xff0c;软件是按自己开发 STM32 OAT 功能需求开发的一款辅助 上位机软件。 文中的介绍时 bootloader boot 文档在补充完善中... 有兴趣的朋友可留言探讨。 1. 软件功能&#xff1a; 1.生成 bin&#x…

基于模块自定义扩展字段的后端逻辑实现(二)

目录 一&#xff1a;创建表 二&#xff1a;代码逻辑 上一节我们详细讲解了自定义扩展字段的逻辑实现和表的设计&#xff0c;这一节我们以一个具体例子演示下&#xff0c;如何实现一个订单模块的自定义扩展数据。 一&#xff1a;创建表 订单主表: CREATE TABLE t_order ( …

VSCode C/C++(gdb)调试指南

1、安装插件 2、F5开启调试 左侧侧边栏->确保打开回调栈 右键函数栈->查看反汇编 3、打印寄存器、函数反汇编等 命令&#xff1a; 查看main反汇编 -exec disassemble /m main 查看寄存器 -exec info r 打印某个变量 -exec print s 或者 --s 打印寄存器&#xff0c;如p…

如何在没有密码的情况下将 iPhone 13/14/15 恢复出厂设置

您想知道如何在没有密码的情况下将 iPhone 13/14/15 恢复出厂设置吗&#xff1f; 出厂重置 iPhone 13/14/15 成为所有 iPhone 机型中最简单的。大多数情况下&#xff0c;iPhone 13/14/15 是在 iOS 15 或更高版本的 iOS 版本上&#xff0c;Apple 更新了无需密码重置 iPhone 13/…

IoT 物联网 MQTT 协议 5.0 版本新特性

MQTT 是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专门为设备资源有限和低带宽、高延迟的不稳定网络环境的物联网场景应用而设计&#xff0c;可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于智能硬件、智慧城市、智慧农业、智慧医疗、新零…

GAMES101-Assignment5

一、问题总览 在这次作业中&#xff0c;要实现两个部分&#xff1a;光线的生成和光线与三角的相交。本次代码框架的工作流程为&#xff1a; 从main 函数开始。我们定义场景的参数&#xff0c;添加物体&#xff08;球体或三角形&#xff09;到场景中&#xff0c;并设置其材质&…

项目管理:风险的来源及管理方法

项目风险是项目管理中的难点之一&#xff0c;虽然我们无法将其完全消除&#xff0c;但可以提前做好准备&#xff0c;将风险降至最低。 项目风险如同暗礁潜伏&#xff0c;你和团队需时刻保持警惕。以下几种风险需特别关注&#xff1a; 措施不足&#xff1a;成本与行动的误差&…

加速科技ST2500 数模混合信号测试设备累计装机量突破500台!

国产数字机&#xff0c;测试中国芯&#xff01;新年伊始&#xff0c;国产半导体测试设备领军企业加速科技迎来了振奋人心的一刻&#xff0c;ST2500 数模混合信号测试设备累计装机量突破500台&#xff01;加速科技凭借其持续的创新能力、完善的解决方案能力、专业热忱的本地化服…

软件定义存储

软件定义存储源于VMware公司于2012年提出的软件定义的数据中心&#xff08;SDDC&#xff09;。存储作为软件定义的数据中心不可或缺的一部分&#xff0c;其以虚拟化为基础&#xff0c;但又不仅限于虚拟化。存储虚拟化一般只能在专门的硬件设备上应用&#xff0c;很多设备都是经…

笔记本摄像头模拟监控推送RTSP流

使用笔记本摄像头模拟监控推送RTSP流 一、基础安装软件准备 本文使用软件下载链接:下载地址 FFmpeg软件: Download ffmpeg 选择Windows builds by BtbN 一个完整的跨平台解决方案&#xff0c;用于录制、转换和流式传输音频和视频。 EasyDarwin软件&#xff1a;Download Easy…

企业小文件多传输慢怎么办?怎么解决海量小文件传输慢的问题?

在当今信息时代&#xff0c;许多企业在文件传输过程中普遍面临一个棘手问题——小文件传输缓慢。这不仅对企业工作效率产生不良影响&#xff0c;还可能导致运营成本增加以及数据遗失与损坏的风险。那么&#xff0c;企业应该如何解决海量小文件传输缓慢的问题呢&#xff1f;本文…