100个 Unity踩坑小知识点】| Unity调用API ,动态获取Android权限,附带所有Android权限表格

网友投稿 1125 2022-05-29

Unity

【100个 Unity踩坑小知识点】| Unity调用API ,动态获取Android权限,附带所有Android权限表格

小科普

老规矩,先介绍一下

Unity

的科普小知识:

Unity

是 实时3D互动内容创作和运营平台 。

Unity

平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括

手机

平板电脑

PC

游戏主机

增强现实

虚拟现实设备。

也可以简单把

Unity

理解为一个

游戏引擎

,可以用来专业制作

游戏

Unity

踩坑小知识点学习

Unity调用API ,动态获取Android权限

在开发安卓应用时,经常会用到获取Android权限的问题。

这个问题有两种解决方案

一种是在Android端就已经写好了动态获取权限的方法,Unity调用该方法就可以了。

另一种是直接在Unity中调用API,申请权限获取(在2019之后Unity已经提供了面向Android的 权限申请方法)

那对于做Unity开发的来讲,自然是直接在Unity端调用API申请权限比较方便了,下面简单说一下怎样调用。

想了解第一种方法的可以看这篇文章:Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)

Unity官方API链接:https://docs.unity3d.com/ScriptReference/Android.Permission.html

点开源码可以看到Unity也存的是权限名称,这说明我们也可以自定义一些权限用来弹窗,不一定必须使用它写好的。

Unity提供的这个API可以在脚本中直接调用,API使用示例如下:

private void Start() { Permission.RequestUserPermission(Permission.Camera); Permission.RequestUserPermission(Permission.Microphone); Permission.RequestUserPermission(Permission.FineLocation); Permission.RequestUserPermission(Permission.CoarseLocation); Permission.RequestUserPermission(Permission.ExternalStorageRead); Permission.RequestUserPermission(Permission.ExternalStorageWrite); }

下面是一个 使用Unity动态申请权限 的完整的示例代码:

第一种方案:

using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Android; public class PerTest : MonoBehaviour { string[] strs = new string[] { "android.permission.INTERNET", "android.permission.READ_PHONE_STATE", "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.ACCESS_WIFI_STATE", "android.permission.ACCESS_NETWORK_STATE", "android.permission.GET_TASKS", "android.permission.REQUEST_INSTALL_PACKAGES", "android.permission.WAKE_LOCK", "android.permission.SYSTEM_ALERT_WINDOW", "android.permission.CHANGE_WIFI_STATE", "android.permission.CHANGE_NETWORK_STATE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION", "android.permission.SYSTEM_OVERLAY_WINDOW", "android.permission.ACCESS_COARSE_UPDATES", "android.permission.WRITE_SETTINGS", "android.permission.BATTERY_STATS", "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" }; void Start() { for (int i = 0; i <= strs.Length - 1; i++) { Permission.RequestUserPermission(strs[i]); Debug.Log("添加权限: " + strs[i]); } } }

第二种方案:

using System.Linq; using UnityEngine; using UnityEngine.Android; public class PerTest : MonoBehaviour { //想要获取权限的字符串数组 string[] strs = new string[] { "android.permission.INTERNET", "android.permission.READ_PHONE_STATE", "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.ACCESS_WIFI_STATE", "android.permission.ACCESS_NETWORK_STATE", "android.permission.GET_TASKS", "android.permission.REQUEST_INSTALL_PACKAGES", "android.permission.WAKE_LOCK", "android.permission.SYSTEM_ALERT_WINDOW", "android.permission.CHANGE_WIFI_STATE", "android.permission.CHANGE_NETWORK_STATE", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION", "android.permission.SYSTEM_OVERLAY_WINDOW", "android.permission.ACCESS_COARSE_UPDATES", "android.permission.WRITE_SETTINGS", "android.permission.BATTERY_STATS", "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" }; void Start() { //开始动态申请权限 strs.ToList().ForEach(s => { Debug.Log("RequestUserPermission: "+s); if (!Permission.HasUserAuthorizedPermission(s)) { Permission.RequestUserPermission(s); Debug.Log("add RequestUserPermission: " + s); } else { Debug.Log("it has RequestUserPermission: " + s); } }); } }

第三种方案:

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Android; public class PerTest : MonoBehaviour { public static PerTest instance; private void Awake() { instance = this; } //初始化,权限申请要尽可能早 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] public static void Init() { //先把权限添加进列表,然后申请 AndroidPermissionMgr.permissionList.Add("android.permission.READ_PHONE_STATE"); AndroidPermissionMgr.permissionList.Add(Permission.ExternalStorageRead); AndroidPermissionMgr.permissionList.Add(Permission.ExternalStorageWrite); AndroidPermissionMgr.permissionList.Add(Permission.FineLocation); AndroidPermissionMgr.permissionList.Add(Permission.CoarseLocation); AndroidPermissionMgr.StartCheckPermission(0.02f); //开始申请 Debug.Log("权限申请完毕"); } } public static class AndroidPermissionMgr { static int index; public static List permissionList = new List(); public static void StartCheckPermission(float time) { Debug.Log("开始权限申请"); if (permissionList.Count > 0) { Get(permissionList[index], time); } } ///

/// 外部访问方法 /// /// 权限名 /// 如拒绝延迟多久再次申请 static void Get(string type, float time) { if (!Permission.HasUserAuthorizedPermission(type)) { Permission.RequestUserPermission(type); Debug.Log("正在获取的权限:" + type); PerTest.instance.StartCoroutine(Check(type, time)); } else { Debug.Log("权限已经获取:" + type); if (index < permissionList.Count - 1) { index += 1; Get(permissionList[index], time); } } } static IEnumerator Check(string type, float time) { yield return new WaitForSeconds(time); Get(type, time); } }

三种方案的弹窗都是一样的效果,可根据不同的权限需求添加不同的权限。

下面是参考来的所有Android权限表,大家可以参考一下。

Android危险权限

Android所有权限

Android API unity

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:android 十八 蓝牙及Wi-Fi
下一篇:【资料合集】2018华为云技术私享会重磅资料下载
相关文章