【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 所有权限
版权声明: 本文为 InfoQ 作者【呆呆敲代码的小Y】的原创文章。
原文链接:【http://xie.infoq.cn/article/ff0b9bb0ae0d707049e18da4c】。文章转载请联系作者。
呆呆敲代码的小Y
还未添加个人签名 2022.05.25 加入
还未添加个人简介
评论