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

呆呆敲代码的小Y 发表于 2022/03/31 19:35:04 2022/03/31
【摘要】 Unity 小科普老规矩,先介绍一下 Unity 的科普小知识:Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Un...

在这里插入图片描述

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危险权限

编号 权限组 权限
0 CALENDAR READ_CALENDAR
WRITE_CALENDAR
1 CAMERA CAMERA
2 CONTACTS READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
3 LOCATION ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
4 MICROPHONE RECORD_AUDIO
5 PHONE READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
6 SENSORS BODY_SENSORS
7 SMS SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
8 STORAGE READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

Android所有权限

编 号 权限 说明
001 ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,
改值可以修改上传
002 ACCESS_COARSE_LOCATION 允许一个程序访问CellID或 WiFi热点来获取粗略的位置
003 ACCESS_FINE_LOCATION 允许一个程序访问CellID或 WiFi热点来获取粗略的位置
004 ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令
005 ACCESS_NETWORK_STATE 允许程序获取网络信息状态,如当前的网络连接是否有效
006 ACCESS_NOTIFICATION_POLICY 希望访问通知策略的应用程序的标记许可
007 ACCESS_WIFI_STATE 允许程序获取当前WiFi接入的状态以及WLAN热点的信息
008 ACCOUNT_MANAGER 允许程序通过账户验证方式访问账户管理
ACCOUNT_MANAGER相关信息
009 ADD_VOICEMAIL 允许一个应用程序添加语音邮件系统
010 BATTERY_STATS 允许程序更新手机电池统计信息
011 BIND_ACCESSIBILITY_SERVICE 请求accessibilityservice服务,以确保只有系统可以 绑定到它
012 BIND_APPWIDGET 允许程序告诉appWidget服务需要访问小插件的数据库, 只有非常少的应用才用到此权限
013 BIND_CARRIER_MESSAGING_SERVICE API等级高于23时使用,否则使用 BIND_CARRIER_SERVICES
014 BIND_CARRIER_SERVICES 允许绑定到运营商应用程序中的服务的系统进程将有这个权限
015 BIND_CHOOSER_TARGET_SERVICE 必须由ChooserTargetService要求,确保只有系统 可以绑定到它
016 BIND_DEVICE_ADMIN 请求系统管理员接收者receiver,只有系统才能使用
017 BIND_DREAM_SERVICE 必须由一个DreamService要求,确保只有系统可以绑定到它
018 BIND_INCALL_SERVICE 必须由一个MidiDeviceService要求,确保只有系统可以绑定到它
019 BIND_INPUT_METHOD 请求InputMethodService服务,只有系统才能使用
020 BIND_MIDI_DEVICE_SERVICE 必须由一个MidiDeviceService要求,确保只有系统 可以绑定到它
021 BIND_NFC_SERVICE 由HostApduService或OffHostApduService必须确保只有系统 可以绑定到它
022 BIND_NOTIFICATION_LISTENER_SERVICE 必须要求由 notificationlistenerservice,以确保只有系统可以绑定到它
023 BIND_PRINT_SERVICE 必须要求由printservice,以确保只有系统可以绑定到它
024 BIND_REMOTEVIEWS 必须通过RemoteViewsService服务来请求,只有系统才能用
025 BIND_TELECOM_CONNECTION_SERVICE 必须由ConnectionService要求,确保只有系统 可以绑定到它
026 BIND_TEXT_SERVICE 必须要求textservice(例如吗 spellcheckerservice), 以确保只有系统可以绑定到它
027 BIND_TV_INPUT 必须由TvInputService需要确保只有系统可以绑定到它
028 BIND_VOICE_INTERACTION 必须由VoiceInteractionService要求, 确保只有系统可以绑定到它
029 BIND_VPN_SERVICE 绑定VPN服务必须通过VpnService服务来请求,只有系统才能用
030 BIND_WALLPAPER 必须通过WallpaperService服务来请求,只有系统才能用
031 BLUETOOTH 允许程序连接配对过的蓝牙设备
032 BLUETOOTH_ADMIN 允许程序进行发现和配对新的蓝牙设备
033 BLUETOOTH_PRIVILEGED 允许应用程序配对蓝牙设备,而无需用户交互。 这不是第三方应用程序可用
034 BODY_SENSORS 允许应用程序访问用户使用的传感器来测量他/她的 身体内发生了什么,如心率仪
035 BROADCAST_PACKAGE_REMOVED 允许程序广播一个提示消息在一个应用程序包已经移除后
036 BROADCAST_SMS 允许程序当收到短信时触发一个广播
037 BROADCAST_STICKY 允许程序收到广播后快速收到下一个广播
038 BROADCAST_WAP_PUSH WAP PUSH服务收到后触发一个广播
039 CALL_PHONE 允许程序从非系统拨号器里拨打电话
040 CALL_PRIVILEGED 允许程序拨打电话,替换系统的拨号器界面
041 CAMERA 允许程序访问摄像头进行拍照
042 CAPTURE_AUDIO_OUTPUT 允许一个应用程序捕获音频输出。不被第三方应用使用
043 CAPTURE_SECURE_VIDEO_OUTPUT 允许一个应用程序捕获视频输出。不被第三方应用使用
044 CAPTURE_VIDEO_OUTPUT 允许一个应用程序捕获视频输出,不被第三方应用使用
045 CHANGE_COMPONENT_ENABLED_STATE 改变组件是否启用状态
046 CHANGE_CONFIGURATION 允许当前应用改变配置,如定位
047 CHANGE_NETWORK_STATE 允许程序改变网络状态,如是否联网
048 CHANGE_WIFI_MULTICAST_STATE 允许程序改变WiFi多播状态
049 CHANGE_WIFI_STATE 允许程序改变WiFi状态
050 CLEAR_APP_CACHE 允许程序清除应用缓存
051 CONTROL_LOCATION_UPDATES 允许程序获得移动网络定位信息改变
052 DELETE_CACHE_FILES 允许程序删除缓存文件
053 DELETE_PACKAGES 允许程序删除应用
054 DIAGNOSTIC 允许程序到RW到诊断资源
055 DISABLE_KEYGUARD 允许程序禁用键盘锁
056 DUMP 允许程序获取系统dump信息从系统服务
057 EXPAND_STATUS_BAR 允许程序扩展或收缩状态栏
058 FACTORY_TEST 允许程序运行工厂测试模式
059 FLASHLIGHT 允许访问闪光灯
060 GET_ACCOUNTS 允许程序访问账户Gmail列表
061 GET_ACCOUNTS_PRIVILEGED 允许访问帐户服务中的帐户列表
062 GET_PACKAGE_SIZE 允许一个程序获取任何package占用空间容量
063 GET_TASKS 允许一个程序获取信息有关当前或最近运行的任务,一个 缩略的任务状态,是否活动等等
064 GLOBAL_SEARCH 允许程序允许全局搜索
065 INSTALL_LOCATION_PROVIDER 允许程序安装定位提供
066 INSTALL_PACKAGES 允许程序安装应用
067 INSTALL_SHORTCUT 创建快捷方式
068 INTERNET 允许程序访问网络连接,可能产生GPRS流量
069 KILL_BACKGROUND_PROCESSES 允许程序调用killBackgroundProcesses(String).方法结束后台进程
070 LOCATION_HARDWARE 允许一个应用程序中使用定位功能的硬件,不使用第三方应用
071 MANAGE_DOCUMENTS 允许一个应用程序来管理文档的访问,通常是一个文档选择器部分
072 MASTER_CLEAR 允许程序执行软格式化,删除系统配置信息
073 MEDIA_CONTENT_CONTROL 允许一个应用程序知道什么是播放和控制其内容。 不被第三方应用使用
074 MODIFY_AUDIO_SETTINGS 允许程序修改声音设置信息
075 MODIFY_PHONE_STATE 允许程序修改电话状态,如飞行模式,但不包含替换系统拨号器界面
076 MOUNT_FORMAT_FILESYSTEMS 允许程序格式化可移动文件系统,比如格式化清空SD卡
077 MOUNT_UNMOUNT_FILESYSTEMS 允许程序挂载、反挂载外部文件系统
078 NFC 允许程序执行NFC近距离通讯操作,用于移动支持
079 PACKAGE_USAGE_STATS 允许一个程序设置他的activities显示
080 PERSISTENT_ACTIVITY 允许程序创建一个永久的Activity,该功能标记为将来将被移除
081 PROCESS_OUTGOING_CALLS 允许程序监视,修改或放弃播出电话
082 READ_CALENDAR 允许程序读取用户的日程信息
083 READ_CALL_LOG 读取通话记录
084 READ_CONTACTS 允许程序访问联系人通讯录信息
085 READ_EXTERNAL_STORAGE 程序可以读取设备外部存储空间(内置SDcard和外置SDCard) 的文件,如果您的App已经添加了”WRITE_EXTERNAL_STORAGE” 权限,则就没必要添加读的权限了,写权限已经 包含了读权限了
086 READ_FRAME_BUFFER 允许程序读取帧缓存用于屏幕截图
087 READ_INPUT_STATE 允许程序读取当前键的输入状态,仅用于系统
088 READ_LOGS 允许程序读取系统底层日志
089 READ_PHONE_STATE 允许程序访问电话状态
090 READ_SMS 允许程序读取短信内容
091 READ_SYNC_SETTINGS 允许程序读取同步设置,读取Google在线同步设置
092 READ_SYNC_STATS 允许程序读取同步状态,获得Google在线同步状态
093 READ_VOICEMAIL 允许应用程序在系统读取语音邮件
094 REBOOT 允许程序重新启动设备
095 RECEIVE_BOOT_COMPLETED 允许程序开机自动运行
096 RECEIVE_MMS 允许程序接收彩信
097 RECEIVE_SMS 允许程序接收短信
098 RECEIVE_WAP_PUSH 允许程序接收WAP PUSH信息
099 RECORD_AUDIO 允许程序录制声音通过手机或耳机的麦克
100 REORDER_TASKS 允许程序重新排序系统Z轴运行中的任务
101 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限的应用程序必须要使用 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 这是一个正常的权限:一个应用程序请求 它将永远被授予权限,而不需要用户批准或看到它。
102 REQUEST_INSTALL_PACKAGES 允许应用程序请求安装包。针对API大于22必须持有 该许可使用ACTION_INSTALL_PACKAGE应用。
103 RESTART_PACKAGES 允许程序结束任务通过restartPackage(String)方法, 该方式将在外来放弃
104 SEND_RESPOND_VIA_MESSAGE 允许用户在来电的时候用你的应用进行即时的短信息回复
105 SEND_SMS 允许程序发送短信
106 SET_ALARM 允许程序设置闹铃提醒
107 SET_ALWAYS_FINISH 允许程序设置程序在后台是否总是退出
108 SET_ANIMATION_SCALE 允许程序设置全局动画缩放
109 SET_DEBUG_APP 允许程序设置调试程序,一般用于开发
110 SET_PREFERRED_APPLICATIONS 允许程序设置应用的参数,已不再工作具体查看 addPackageToPreferred(String) 介绍
111 SET_PROCESS_LIMIT 允许程序设置最大的进程数量的限制
112 SET_TIME 允许程序设置系统时间
113 SET_TIME_ZONE 允许程序设置系统时区
114 SET_WALLPAPER 允许程序设置桌面壁纸
115 SET_WALLPAPER_HINTS 允许程序设置壁纸建议
116 SIGNAL_PERSISTENT_PROCESSES 允许程序发送一个永久的进程信号
117 STATUS_BAR 允许程序打开、关闭、禁用状态栏
118 SYSTEM_ALERT_WINDOW 允许程序显示系统窗口
119 TRANSMIT_IR 允许使用设备的红外发射器,如果可用
120 UNINSTALL_SHORTCUT 删除快捷方式
121 UPDATE_DEVICE_STATS 允许程序更新设备状态
122 USE_FINGERPRINT 允许应用程序使用指纹硬件
123 USE_SIP 允许程序使用SIP视频服务
124 VIBRATE 允许程序振动
125 WAKE_LOCK 允许程序在手机屏幕关闭后后台进程仍然运行
126 WRITE_APN_SETTINGS 允许程序写入网络GPRS接入点设置
127 WRITE_CALENDAR 允许程序写入日程,但不可读取
128 WRITE_CALL_LOG 允许程序写入(但是不能读)用户的联系人数据
129 WRITE_CONTACTS 写入联系人,但不可读取
130 WRITE_EXTERNAL_STORAGE 允许程序写入外部存储,如SD卡上写文件
131 WRITE_GSERVICES 允许程序修改Google服务地图
132 WRITE_SECURE_SETTINGS 允许应用程序读取或写入安全系统设置
133 WRITE_SETTINGS 允许程序读取或写入系统设置
134 WRITE_SYNC_SETTINGS 允许程序写入同步设置
135 WRITE_VOICEMAIL 允许应用程序修改和删除系统中的现有的语音邮件, 只有系统才能使用
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。