【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 加入
还未添加个人简介










 
    
评论