配置并获取安卓权限
- unity打包安卓的制杖问题
- 区分权限类型,否则会卡主线程
- AndroidManifest和Permissionhandler中的permissions保持一致
操作步骤
-
设置自定义权限
-
添加对应权限
<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.BATTERY_STATS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
- 编辑权限脚本
/* ***********************************************
* Discribe:获取安卓权限,得不掉就毁到
* Author:Wilson
* CreateTime:2021-10-11 11:08:29
* Edition:1.0
* ************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Android;
public class PermissionHandler : MonoBehaviour
{
List<string> permissions =
new List<string>
{
"android.permission.ACCESS_NETWORK_STATE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.INTERNET",
"android.permission.CAMERA",
"android.permission.BATTERY_STATS",
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS",
"android.permission.RECEIVE_BOOT_COMPLETED",
};
IEnumerator Start()
{
for (int i = 0; i < permissions.Count; i++)
{
yield return GetPermission(permissions[i]);
}
}
IEnumerator GetPermission(string permission)
{
while (true)
{
if (Permission.HasUserAuthorizedPermission(permission) == false)
{
Permission.RequestUserPermission(permission);
}
else
{
break;
}
yield return new WaitForSeconds(1);
}
}
}
官网权限说明
下文提供有关硬件功能、软件功能以及隐含具体功能要求的权限集的参考信息。
硬件功能
此部分介绍最新平台版本所支持的硬件功能。如要指出您的应用使用或需要某项硬件功能,请在 android:name
属性中声明相应的值(以 "android.hardware"
开头)。每次声明硬件功能时,请使用单独的 <uses-feature>
元素。
音频硬件功能
android.hardware.audio.low_latency
android.hardware.audio.output
android.hardware.audio.pro
android.hardware.microphone
蓝牙硬件功能
android.hardware.bluetooth
android.hardware.bluetooth_le
相机硬件功能
android.hardware.camera
android.hardware.camera.any
功能。
android.hardware.camera.any
android.hardware.camera
。
android.hardware.camera.autofocus
应用使用设备相机支持的自动对焦功能。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.camera</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
android.hardware.camera.capability.manual_post_processing
应用使用设备相机支持的 MANUAL_POST_PROCESSING
功能。
<p>
您的应用可通过该功能替换相机的自动白平衡功能。使用 <code>android.colorCorrection.transform</code>、<code>android.colorCorrection.gains</code> 以及 <code>TRANSFORM_MATRIX</code> 的 <code>android.colorCorrection.mode</code>。
</p>
android.hardware.camera.capability.manual_sensor
应用使用设备相机支持的 MANUAL_SENSOR
功能。
<p>
此功能隐含对自动曝光锁定 (<code>android.control.aeLock</code>) 的支持,从而让相机的曝光时间和灵敏度一直固定在特定值。
</p>
android.hardware.camera.capability.raw
应用使用设备相机支持的 RAW
功能。
<p>
此功能暗示设备可以保存 DNG(原始)文件,并且设备的相机会提供应用直接处理这些原始图像所需的 DNG 相关元数据。
</p>
android.hardware.camera.external
android.hardware.camera.flash
应用使用设备相机所支持的闪光灯功能。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.camera</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
android.hardware.camera.front
应用使用设备的前置相机。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.camera</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
android.hardware.camera.level.full
FULL
级图像捕捉支持。提供
FULL
支持的相机可提供快速捕捉功能、逐帧控制和手动后期处理控制。
设备界面硬件功能
android.hardware.type.automotive
将应用设计为在车辆内的一组屏幕上显示其界面。用户通过硬按钮、轻触、旋转控制器以及类鼠标界面与应用进行交互。车辆的屏幕通常出现在车辆的中控台或仪表板中。这些屏幕的尺寸和分辨率通常有限。
<p class="note">
<strong>注意:</strong>切记,由于用户是在驾车时使用这类应用界面,应用必须尽量不要让驾驶员分心。
</p>
android.hardware.type.television
(已弃用;请改用 android.software.leanback
。)
<p>
将应用设计为在电视上显示其界面。此功能将“电视”定义为一种典型的起居室电视体验:显示在大屏幕上,用户坐在远处,主流输入形式是类似方向键的设备,并且一般不使用鼠标、指示器或触摸设备。
</p>
android.hardware.type.watch
指纹硬件功能
android.hardware.fingerprint
手柄硬件功能
android.hardware.gamepad
红外线硬件功能
android.hardware.consumerir
定位硬件功能
android.hardware.location
android.hardware.location.gps
应用使用通过设备的全球定位系统 (GPS) 接收器获得的精确位置坐标。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.location</code> 功能(除非使用属性 <code>android:required="false"</code> 声明此父功能)。
</p>
android.hardware.location.network
应用使用通过设备所支持的基于网络的地理定位系统获得的粗略位置坐标。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.location</code> 功能(除非使用属性 <code>android:required="false"</code> 声明此父功能)。
</p>
NFC 硬件功能
android.hardware.nfc
android.hardware.nfc.hce
应用使用托管在设备上的 NFC 卡模拟。
OpenGL ES 硬件功能
android.hardware.opengles.aep
传感器硬件功能
android.hardware.sensor.accelerometer
android.hardware.sensor.ambient_temperature
android.hardware.sensor.barometer
android.hardware.sensor.compass
android.hardware.sensor.gyroscope
android.hardware.sensor.hifi_sensors
android.hardware.sensor.heartrate
android.hardware.sensor.heartrate.ecg
android.hardware.sensor.light
android.hardware.sensor.proximity
android.hardware.sensor.relative_humidity
android.hardware.sensor.stepcounter
android.hardware.sensor.stepdetector
屏幕硬件功能
android.hardware.screen.landscape
android.hardware.screen.portrait
应用要求设备使用纵向或横向方向。如果您的应用同时支持这两种方向,则无需声明任一功能。
<p>
例如,如果您的应用要求纵向方向,则应声明以下功能,使得只有支持纵向方向(始终或由用户选择)的设备才能运行您的应用:
</p>
<devsite-code data-copy-event-label=""><div class="devsite-code-buttons-container" role="group" aria-label="操作按钮"><button type="button" class="gc-analytics-event material-icons devsite-icon-code-dark devsite-toggle-dark" data-category="Site-Wide Custom Events" data-label="Dark Code Toggle" track-type="exampleCode" track-name="darkCodeToggle" aria-label="深色代码主题背景" data-title="深色代码主题背景"></button><button type="button" class="gc-analytics-event material-icons devsite-icon-code-light devsite-toggle-light" data-category="Site-Wide Custom Events" data-label="Light Code Toggle" track-type="exampleCode" track-name="lightCodeToggle" aria-label="浅色代码主题背景" data-title="浅色代码主题背景"></button><button type="button" class="gc-analytics-event material-icons devsite-icon-copy" data-category="Site-Wide Custom Events" data-label="Click To Copy" track-type="exampleCode" track-name="clickToCopy" aria-label="复制代码示例" data-title="复制代码示例"></button></div><pre class="lang-xml" is-upgraded=""><span class="tag"><uses-feature</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.hardware.screen.portrait"</span><span class="pln"> </span><span class="tag">/></span></pre></devsite-code>
<p>
默认情况下假定两种方向均非要求的方向,这样便可在支持一种或同时支持两种方向的设备上安装您的应用。不过,如果应用的任一 Activity 利用 <a href="https://developer.android.google.cn/guide/topics/manifest/activity-element?hl=zh-cn#screen"><code>android:screenOrientation</code></a> 属性请求在特定方向下运行,则此声明意味着您的应用需要该方向。例如,如果您使用 <code>"landscape"</code>、<code>"reverseLandscape"</code> 或 <code>"sensorLandscape"</code> 声明 <a href="https://developer.android.google.cn/guide/topics/manifest/activity-element?hl=zh-cn#screen"><code>android:screenOrientation</code></a>,则您的应用只能安装在支持横向方向的设备上。
</p>
<p>
最佳做法是,您仍应使用 <code><uses-feature></code> 元素来声明对该方向的要求。如果您使用 <a href="https://developer.android.google.cn/guide/topics/manifest/activity-element?hl=zh-cn#screen"><code>android:screenOrientation</code></a> 为 Activity 声明某个方向,但实际并无此要求,则可通过使用 <code><uses-feature></code> 元素并加入 <code>android:required="false"</code> 来声明该方向,进而停用这一要求。
</p>
<p>
为实现向后兼容性,任何运行 Android 3.1(API 级别 12)或更低版本的设备均支持横向和纵向方向。
</p>
电话硬件功能
android.hardware.telephony
android.hardware.telephony.cdma
应用使用码分多址接入 (CDMA) 无线电话系统。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.telephony</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
android.hardware.telephony.gsm
应用使用全球移动通讯系统 (GSM) 无线电话系统。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.telephony</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
触摸屏硬件功能
android.hardware.faketouch
应用使用基本的轻触交互事件,例如点按和拖动。
<p>
当声明为必需时,此功能表示只有当设备可模拟触摸屏(“假触摸”界面)或实际具有触摸屏时,应用才能与之兼容。
</p>
<p>
如果设备带有假触摸界面,则其会为用户提供模拟部分触摸屏功能的用户输入系统。例如,鼠标或遥控器可以驱动屏幕上的光标。如果您的应用需要基本的点击式交互(换言之,它在只使用方向键控制器的情况下无法正常工作),则应声明该功能。由于这是最低水平的触摸交互,因此您还可在提供更复杂触摸界面的设备上使用声明该功能的应用。
</p>
<p class="note">
<strong>注意:</strong>默认情况下,应用需要 <code>android.hardware.faketouch</code> 功能。如果您想将自己的应用限制为仅供拥有触摸屏的设备使用,则必须按如下方式显式声明要求提供触摸屏:</p>
<devsite-code data-copy-event-label=""><div class="devsite-code-buttons-container" role="group" aria-label="操作按钮"><button type="button" class="gc-analytics-event material-icons devsite-icon-code-dark devsite-toggle-dark" data-category="Site-Wide Custom Events" data-label="Dark Code Toggle" track-type="exampleCode" track-name="darkCodeToggle" aria-label="深色代码主题背景" data-title="深色代码主题背景"></button><button type="button" class="gc-analytics-event material-icons devsite-icon-code-light devsite-toggle-light" data-category="Site-Wide Custom Events" data-label="Light Code Toggle" track-type="exampleCode" track-name="lightCodeToggle" aria-label="浅色代码主题背景" data-title="浅色代码主题背景"></button><button type="button" class="gc-analytics-event material-icons devsite-icon-copy" data-category="Site-Wide Custom Events" data-label="Click To Copy" track-type="exampleCode" track-name="clickToCopy" aria-label="复制代码示例" data-title="复制代码示例"></button></div><pre class="lang-xml devsite-code-highlight" is-upgraded=""><span class="tag"><uses-feature</span><span class="pln"> </span><span class="atn">android:name</span><span class="pun">=</span><span class="atv">"android.hardware.touchscreen"</span><span class="pln"><br> </span><strong><span class="atn">android:required</span><span class="pun">=</span><span class="atv">"true"</span></strong><span class="pln"> </span><span class="tag">/></span></pre></devsite-code>
<p>所有未显示要求 <code>android.hardware.touchscreen</code> 的应用也可在支持 <code>android.hardware.faketouch</code> 的设备上运行。
</p>
<uses-feature android:name=“android.hardware.touchscreen” android:required=“false” />
android.hardware.faketouch.multitouch.distinct
应用在假触摸界面上区分两根或更多“手指”的触摸轨迹。这是 android.hardware.faketouch
功能的一个超集。当声明为必需时,此功能表示只有当设备模拟区分两根或更多手指的触摸轨迹,或实际具有触摸屏时,应用才能与之兼容。
<p>
不同于 <code>android.hardware.touchscreen.multitouch.distinct</code> 所定义的区分式多点触摸,通过假触摸界面支持区分式多点触摸的输入设备并不支持所有双指手势,因为输入会转换成屏幕上的光标移动。换言之,在此类设备上,单指手势移动光标,双指划动触发单指触摸事件,而其他双指手势则触发相应的双指触摸事件。
</p>
<p>
如果设备提供双指触摸触控板进行光标移动,则其可支持此功能。
</p>
android.hardware.faketouch.multitouch.jazzhand
应用在假触摸界面上区分五根或更多“手指”的触摸轨迹。这是 android.hardware.faketouch
功能的一个超集。当声明为必需时,此功能表示只有当设备模拟区分五根或更多手指的触摸轨迹,或实际具有触摸屏时,应用才能与之兼容。
<p>
不同于 <code>android.hardware.touchscreen.multitouch.jazzhand</code> 所定义的区分式多点触摸,通过假触摸界面支持五指式多点触摸的输入设备并不支持所有五指手势,因为输入会转换成屏幕上的光标移动。换言之,在此类设备上,单指手势移动光标,多指划手势触发单指触摸事件,而其他多指手势则触发相应的多指触摸事件。
</p>
<p>
如果设备提供五指触摸触控板进行光标移动,则其可支持此功能。
</p>
android.hardware.touchscreen
应用利用设备的触摸屏功能来实现比基本触摸事件交互性更强的手势,例如滑屏。这是 android.hardware.faketouch
功能的一个超集。
<p>
默认情况下,您的应用需要该功能。因此,如果设备默认只提供模拟触摸界面(“假触摸”),则其无法使用您的应用。如果您希望提供假触摸界面的设备(甚至只提供方向键控制器的设备)可使用您的应用,则必须在声明 <code>android.hardware.touchscreen</code> 时加入 <code>android:required="false"</code>,从而显式声明不要求提供触摸屏。如果您的应用使用(但并不需要)真触摸屏界面,则应添加此声明。所有未显示要求 <code>android.hardware.touchscreen</code> 的应用也可在支持 <code>android.hardware.faketouch</code> 的设备上运行。
</p>
<p>
如果您的应用确实需要触摸界面(以便执行滑屏之类的更高级触摸手势),则您无需声明任何触摸界面功能,因为它们默认为必需功能。不过,最好还是显式声明应用使用的所有功能。
</p>
<p>
如果您需要进行更复杂的触摸交互(例如多指手势),则应声明您的应用使用高级触摸屏功能。
</p>
android.hardware.touchscreen.multitouch
应用使用设备基本的两点式多点触摸功能(例如实现双指张合手势),但不需要独立追踪触摸轨迹。这是 android.hardware.touchscreen
功能的一个超集。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.touchscreen</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
android.hardware.touchscreen.multitouch.distinct
应用使用设备的高级多点触摸功能,从而独立追踪两点或更多点的轨迹。该功能是 android.hardware.touchscreen.multitouch
功能的一个超集。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.touchscreen.multitouch</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
android.hardware.touchscreen.multitouch.jazzhand
应用使用设备的高级多点触摸功能,从而独立追踪五点或更多点的轨迹。该功能是 android.hardware.touchscreen.multitouch
功能的一个超集。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.hardware.touchscreen.multitouch</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
USB 硬件功能
android.hardware.usb.accessory
android.hardware.usb.host
Vulkan 硬件功能
android.hardware.vulkan.compute
<uses-feature如需了解有关功能版本的详细信息,请参阅
android:name="android.hardware.vulkan.compute"
android:version="0"
android:required="true" />
FEATURE_VULKAN_HARDWARE_COMPUTE
。
android.hardware.vulkan.level
<uses-feature如需了解有关功能版本的详细信息,请参阅
android:name="android.hardware.vulkan.level"
android:version="0"
android:required="true" />
FEATURE_VULKAN_HARDWARE_LEVEL
。
android.hardware.vulkan.version
<uses-feature如需了解有关功能版本的详细信息,请参阅
android:name="android.hardware.vulkan.version"
android:version="0x400003"
android:required="true" />
FEATURE_VULKAN_HARDWARE_VERSION
。
Wi-Fi 硬件功能
android.hardware.wifi
android.hardware.wifi.direct
软件功能
此部分介绍最新平台版本所支持的软件功能。如要指出您的应用使用或需要某项软件功能,请在 android:name
属性中声明相应的值(以 "android.software"
开头)。每次声明软件功能时,请使用单独的 <uses-feature>
元素。
通信软件功能
android.software.sip
android.software.sip.voip
应用使用基于 SIP 的互联网语音协议 (VoIP) 服务。通过使用 VoIP,应用可以支持实时互联网电话操作,例如双向视频会议。
<p>
通过使用此功能,应用暗示其还会使用 <code>android.software.sip</code> 功能(除非使用 <code>android:required="false"</code> 声明此父功能)。
</p>
android.software.webview
自定义输入软件功能
android.software.input_methods
InputMethodService
中定义。
设备管理软件功能
android.software.backup
android.software.device_admin
android.software.managed_users
android.software.securely_removes_users
android.software.verified_boot
媒体软件功能
android.software.midi
android.software.print
android.software.leanback
android.software.live_tv
屏幕界面软件功能
android.software.app_widgets
android.software.home_screen
android.software.live_wallpaper
隐含功能要求的权限
相应 API 发布后,应用可使用一些硬件和软件功能常量;例如,android.hardware.bluetooth
功能添加于 Android 2.2(API 级别 8),但其引用的 Bluetooth API 却添加于 Android 2.0(API 级别 5)。因此,在能够利用 <uses-feature>
系统声明需要某个 API 之前,一些应用便已具备使用该 API 的能力。
为防止无意间提供这些应用,Google Play 会假定特定硬件相关权限规定,默认情况下需要底层硬件功能。例如,使用蓝牙的应用必须在 <uses-permission>
元素中请求 BLUETOOTH
权限 — 对于旧版应用,Google Play 假定权限声明意味着,应用需要底层 android.hardware.bluetooth
功能,并根据该功能设置过滤。表 2 所列权限隐含的功能要求等同于 <uses-feature>
元素中声明的功能。
请注意,<uses-feature>
声明(包括任何声明的 android:required
属性)的优先级始终高于表 2 中权限所隐含的功能。对于上述任一权限,您均可通过在 <uses-feature>
元素中使用 android:required="false"
属性来显式声明隐含功能,从而停用根据隐含功能进行过滤。例如,如要停用根据 CAMERA
权限进行任何过滤,您需向清单文件添加下方的 <uses-feature>
声明:
<uses-feature android:name=“android.hardware.camera” android:required=“false” />
注意:如果应用面向 Android 5.0(API 级别 21)或更高版本,并使用 ACCESS_COARSE_LOCATION
或 ACCESS_FINE_LOCATION
权限接收来自网络或 GPS 的位置更新,您还必须分别显式声明应用使用 android.hardware.location.network
或 android.hardware.location.gps
硬件功能。
类别 | 权限... | ...隐含此功能要求 |
---|
BLUETOOTH
android.hardware.bluetooth
(如需了解详情,请参阅针对蓝牙功能的特殊处理。)
BLUETOOTH_ADMIN
android.hardware.bluetooth
摄像头
CAMERA
android.hardware.camera
和
android.hardware.camera.autofocus
位置
ACCESS_MOCK_LOCATION
android.hardware.location
ACCESS_LOCATION_EXTRA_COMMANDS
android.hardware.location
INSTALL_LOCATION_PROVIDER
android.hardware.location
ACCESS_COARSE_LOCATION
android.hardware.location
android.hardware.location.network
(仅适用于目标 API 级别 20 或更低版本。)
ACCESS_FINE_LOCATION
android.hardware.location
android.hardware.location.gps
(仅适用于目标 API 级别 20 或更低版本。)
RECORD_AUDIO
android.hardware.microphone
电话
CALL_PHONE
android.hardware.telephony
CALL_PRIVILEGED
android.hardware.telephony
MODIFY_PHONE_STATE
android.hardware.telephony
PROCESS_OUTGOING_CALLS
android.hardware.telephony
READ_SMS
android.hardware.telephony
RECEIVE_SMS
android.hardware.telephony
RECEIVE_MMS
android.hardware.telephony
RECEIVE_WAP_PUSH
android.hardware.telephony
SEND_SMS
android.hardware.telephony
WRITE_APN_SETTINGS
android.hardware.telephony
WRITE_SMS
android.hardware.telephony
Wi-Fi
ACCESS_WIFI_STATE
android.hardware.wifi
CHANGE_WIFI_STATE
android.hardware.wifi
CHANGE_WIFI_MULTICAST_STATE
android.hardware.wifi