写点什么

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

  • 2022 年 6 月 06 日
  • 本文字数:4174 字

    阅读完需:约 14 分钟

Unity 小科普

老规矩,先介绍一下 Unity 的科普小知识:

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

  • 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。

  • 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<string> permissionList = new List<string>();
public static void StartCheckPermission(float time) { Debug.Log("开始权限申请"); if (permissionList.Count > 0) { Get(permissionList[index], time); } }
/// <summary> /// 外部访问方法 /// </summary> /// <param name="type">权限名</param> /// <param name="time">如拒绝延迟多久再次申请</param> 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 常用权限整理

<!--连接网络权限,用于执行云端语音能力 --><uses-permission android:name="android.permission.INTERNET"/><!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 --><uses-permission android:name="android.permission.RECORD_AUDIO"/><!--读取网络信息状态 --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!--获取当前wifi状态 --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><!--允许程序改变网络连接状态 --><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/><!--读取手机信息权限 --><uses-permission android:name="android.permission.READ_PHONE_STATE"/><!--读取联系人权限,上传联系人需要用到此权限 --><uses-permission android:name="android.permission.READ_CONTACTS"/><!--外存储写权限,构建语法需要用到此权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--外存储读权限,构建语法需要用到此权限 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><!--配置权限,用来记录应用配置信息 --><uses-permission android:name="android.permission.WRITE_SETTINGS"    tools:ignore="ProtectedPermissions" /><!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务--><!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 --><uses-permission android:name="android.permission.CAMERA" />
复制代码

Android 危险权限

Android 所有权限


发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2022.05.25 加入

还未添加个人简介

评论

发布
暂无评论
【100个 Unity踩坑小知识点】| Unity调用API ,动态获取Android权限,附带所有Android权限表格_呆呆敲代码的小Y_InfoQ写作社区