以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.rhkb.cn/news/233476.html

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

相关文章

以对象为中心的视频编辑;SDXL高质量缩小版;Transformer在FPGA上实现12.8倍速度提升;深入研究ViT固有问题

本文首发于公众号&#xff1a;机器感知 以对象为中心的视频编辑&#xff1b;SDXL高质量缩小版&#xff1b;Transformer在FPGA上实现12.8倍速度提升&#xff1b;深入研究ViT固有问题 VASE: Object-Centric Appearance and Shape Manipulation of Real Videos 现有方法通过文生…

前端学习笔记 3:Vue 工程

前端学习笔记 3&#xff1a;Vue 工程 上一篇文章介绍了如何在单一 Html 页面中使用 Vue&#xff0c;本文介绍如何从头开始用 Vue 构建一个前端工程项目。 1.环境准备 Vue 框架代码的创建依赖于 Node.js&#xff0c;因此需要先安装 Node.js。 2.创建和启动 2.1.创建 通过以…

MongoDB高级集群架构设计

两地三中心集群架构设计 容灾级别 RPO & RTO RPO&#xff08;Recovery Point Objective&#xff09;&#xff1a;即数据恢复点目标&#xff0c;主要指的是业务系统所能容忍的数据丢失量。RTO&#xff08;Recovery Time Objective&#xff09;&#xff1a;即恢复时间目标&…

OpenHarmony内存泄漏指南 - 解决问题(综合)

本系列文章旨在提供定位与解决OpenHarmony应用与子系统内存泄露的常见手段与思路&#xff0c;将会分成几个部分来讲解。首先我们需要掌握发现内存泄漏问题的工具与方法&#xff0c;以及判断是否可能存在泄漏。接着需要掌握定位泄漏问题的工具&#xff0c;以及抓取trace、分析tr…

智能计价器Scratch-第14届蓝桥杯Scratch省赛真题第5题

5. 智能计价器&#xff08;80分&#xff09; 背景信息&#xff1a;A城市的出租车计价&#xff1a;3公里以内13元&#xff0c;基本单价每公里2.3元(超过3公里的部分&#xff0c;不满1公里按照1公里收费&#xff09;&#xff0c;燃油附加费每运次1元。例如&#xff1a;3.2公里的…

自动化测试报告生成(Allure)

之前尝试使用过testNG自带的测试报告、优化过reportNG的测试报告&#xff0c;对这两个报告都不能满意。后经查找资料&#xff0c;发现有个神器&#xff1a; Allure&#xff08;已经有allure2了&#xff0c;笔者使用的就是allure2&#xff09;&#xff0c;生成的测试报告与上述…

【回溯算法】n-皇后

导航 题目来源题目描述示例思路完整代码 题目来源 n-皇后 题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一…

【Linux Shell】9. 流程控制

文章目录 【 1. if else 判断 】1.1 if1.2 if else1.3 if elif else1.4 实例 【 2. case 匹配 】【 3. 循环 】3.1 for 循环3.2 while 循环3.3 until 循环3.4 无限循环3.5 跳出循环3.5.1 break 跳出所有循环3.5.2 continue 仅跳出当前循环 【 1. if else 判断 】 1.1 if fi 是…

【算法】递归算法理解(持续更新)

这里写目录标题 一、递归算法1、什么情况下可以使用递归&#xff1f;2、递归算法组成部分3、案例&#xff1a;求n的阶乘4、编写一个递归函数来计算列表包含的元素数。5、通过递归找到列表中最大的数字。6、通过递归的方式实现二分查找算法。 一、递归算法 递归&#xff08;Rec…

“单项突出”的赢双科技IPO加速,比亚迪是最强助力?

近日&#xff0c;新能源汽车核心部件供应商赢双科技首次递表科创板&#xff0c;其凭借旋转变压器产品就坐稳了新能源车企主要供应商的地位&#xff0c;从核心业务及业绩情况来看&#xff0c;赢双科技不愧为“单项冠军”。 据悉&#xff0c;赢双科技本次IPO拟募资8.47亿元&…

3.9 EXERCISES

矩阵加法需要两个输入矩阵A和B&#xff0c;并产生一个输出矩阵C。输出矩阵C的每个元素都是输入矩阵A和B的相应元素的总和&#xff0c;即C[i][j] A[i][j] B[i][j]。为了简单起见&#xff0c;我们将只处理元素为单精度浮点数的平方矩阵。编写一个矩阵加法内核和主机stub函数&am…

P9 视频码率及其码率控制方式

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

一款开源的MES系统

随着工业4.0的快速发展&#xff0c;制造执行系统&#xff08;MES&#xff09;成为了智能制造的核心。今天&#xff0c;将为大家推荐一款开源的MES系统——iMES工厂管家。 什么是iMES工厂管家 iMES工厂管家是一款专为中小型制造企业打造的开源MES系统。它具备高度的可定制性和灵…

Jenkins集成部署java项目

文章目录 Jenkins简介安装 Jenkins简介 Jenkins能实时监控集成中存在的错误&#xff0c;提供详细的日志文件和提醒功能&#xff0c;还能用图表的形式形象的展示项目构建的趋势和稳定性。 官网 安装 在官网下载windows版本的Jenkins 但是我点击这里浏览器没有反应&#xff0…

关于自增和自减的一些细节问题

目录 基本概念 1.运算 2.输出 基本概念 在这里简单回顾一下自增和自减&#xff1a;顾名思义&#xff0c;自就是同一变量的值发生变化&#xff0c;自增就是该变量值加1&#xff0c;自减就是该变量值减1。 自增和自减又可以根据运算符的位置不同分为前缀式和后缀式。前缀就是…

hfish蜜罐docker部署

centos 安装 docker-CSDN博客Docker下载部署 Docker是我们推荐的部署方式之一&#xff0c;当前的版本拥有以下特性&#xff1a; 自动升级&#xff1a;每小时请求最新镜像进行升级&#xff0c;升级不会丢失数据。数据持久化&#xff1a;在宿主机/usr/share/hfish目录下建立dat…

Unity 使用Sprite绘制一条自定义图片的线

Unity 使用Sprite绘制一条自定义图片的线 前言项目场景布置代码编写总结 运行效果感谢 前言 遇到一个需要绘制自定义形状的需求。那只能利用Sprite来绘制一条具有自定义图片的线&#xff0c;通过代码动态设置起点、终点以及线宽&#xff0c;实现灵活的线条效果。 项目 场景…

2024.1.3力扣每日一题——从链表中移除节点

2024.1.3 题目来源我的题解方法一 递归方法二 栈方法三 反转链表方法四 单调栈头插法 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2487 我的题解 方法一 递归 当前节点对其右侧节点是否删除无影响&#xff0c;因此可以对其右侧节点进行递归移除。 若当前节点为空&am…

BLE Mesh蓝牙组网技术详细解析之Access Layer访问层(六)

目录 一、什么是BLE Mesh Access Layer访问层&#xff1f; 二、Access payload 2.1 Opcode 三、Access layer behavior 3.1 Access layer发送消息的流程 3.2 Access layer接收消息的流程 3.3 Unacknowledged and acknowledged messages 3.3.1 Unacknowledged message …

Python selenium实现断言3种方法解析

1.if ...else ...判断进行断言 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from time import * from selenium import webdriver def login(user"admin",pwd"123456"): driver webdriver.Chrome() driver.implicitly_wait(10)…