目标
工具:
- Unity 2021.2.14c1f1
- Android 12 系统手机
目标:实现Unity打出来的Apk包能请求读写android手机本地文件权限
原理
在Android系统中,操作手机中不安全的数据时,需要配置相应的权限,只有经过用户许可才能使用,设置各种权限的原因在于保护用户隐私,那么当我们开发 unity 项目需要请求权限时,可以根据以下方式
- 基于 Unity 官方 API 实现申请 Android 权限,这样不需要在 Android 中写申请权限
- Unity 2019 起提供了 Permission 类申请 Android 权限,2021.3 版本 Unity 的API如下:
静态属性 | 含义 | 描述 |
---|---|---|
Camera | 照相机 | 在请求权限或检查是否已授予使用相机的权限时使用 |
CoarseLocation | 粗略的用户位置定位 | 在请求权限或检查是否已授予以粗粒度使用用户位置的权限时使用 |
FineLocation | 精细的用户位置定位 | 在请求权限或检查是否已授予高精度使用用户位置的权限时使用 |
ExternalStorageRead | 外部存储(如SD卡)读取 | 在请求权限或检查是否已授予从外部存储(如 SD 卡)读取的权限时使用 |
ExternalStorageWrite | 外部存储(如SD卡)写入 | 在请求权限或检查是否已授予写入外部存储(如 SD 卡)的权限时使用 |
Microphone | 麦克风等权限 | 在请求权限或检查是否已授予使用话筒的权限时使用 |
unity 2021.3 官方文档 Permission 介绍
实现
1. 需要在 C# 代码中添加申请权限
using UnityEngine.Android;
...
#if UNITY_ANDROID
//安卓平台要请求从外部设备读写权限,如果安装后通过了权限请求,则以后这个APP就不会弹出请求权限框
//但若安装后请求多次权限,都不通过,则多次后就不会弹出请求权限框
//请求从 (SD 卡等)外部存储读取的权限
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) {
Permission.RequestUserPermission(Permission.ExternalStorageRead);
}
//请求 写入外部存储(如 SD 卡)的权限
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite)) {
Permission.RequestUserPermission(Permission.ExternalStorageWrite);
}
#endif
...
这里只请求外部存储设备的读写权限,其他权限可以参考 Permission
API 实现:
2. 需要在 manifest 文件中声明权限
unity 打 apk 时生成 manifest 文件模板可以手动配置:File > BuildSettings > PlayerSettings > Player > PublishingSettings,启用 CustomMainManifest,表示可以自定义 AndroidManifest.xml 文件
通过路径找到对应的 AndroidManifest.xml 文件:
在 application 标签上面添加所需要的安卓权限的声明:
保存后,打APK包运行即可看到在运行到 C# 代码时,请求安卓权限