解决办法
需求:在 Unity 中申请 Android 14 的外部存储读写权限,并跳转到系统设置页面让用户手动授权
1,设置 AndroidManifest.xml
在 Unity 项目的 AndroidManifest.xml 中添加 MANAGE_EXTERNAL_STORAGE 权限声明
1.1,自定义 AndroidManifest.xml文件生成
(1)在 Unity 中打开 Player Settings(菜单栏:Edit > Project Settings > Player)
(2)在 Other Settings 部分,找到 Write Permission,设置为 External (SDCard)
(3)勾选 Custom Main Manifest,Unity 会自动生成一个 AndroidManifest.xml 文件,路径为Assets/Plugins/Android/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
</manifest>
2,在 Unity 中编写 C# 脚本来检查权限并跳转到系统设置页面
using UnityEngine;
using UnityEngine.UI;
public class ExternalStoragePermission : MonoBehaviour
{
public Text statusText; // 用于显示状态的 UI Text
void Start()
{
// 检查是否已经拥有权限
if (!HasExternalStoragePermission())
{
RequestExternalStoragePermission();
}
else
{
UpdateStatus("已拥有外部存储权限");
}
}
// 检查是否拥有 MANAGE_EXTERNAL_STORAGE 权限
private bool HasExternalStoragePermission()
{
#if UNITY_ANDROID
using (var version = new AndroidJavaClass("android.os.Build$VERSION"))
{
if (version.GetStatic<int>("SDK_INT") >= 30) // Android 11 (API 30) 及以上
{
using (var environment = new AndroidJavaClass("android.os.Environment"))
{
return environment.CallStatic<bool>("isExternalStorageManager");
}
}
}
#endif
return true; // 低于 Android 11 的设备默认返回 true
}
// 请求 MANAGE_EXTERNAL_STORAGE 权限
private void RequestExternalStoragePermission()
{
#if UNITY_ANDROID
using (var version = new AndroidJavaClass("android.os.Build$VERSION"))
{
if (version.GetStatic<int>("SDK_INT") >= 30) // Android 11 (API 30) 及以上
{
// 跳转到系统设置页面
using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
{
using (var intent = new AndroidJavaObject("android.content.Intent"))
{
// 设置 Intent 的 Action
intent.Call<AndroidJavaObject>("setAction", "android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION");
// 将包名字符串转换为 Uri 对象
using (var uriClass = new AndroidJavaClass("android.net.Uri"))
{
using (var uri = uriClass.CallStatic<AndroidJavaObject>("parse", "package:" + currentActivity.Call<string>("getPackageName")))
{
// 调用 setData 方法
intent.Call<AndroidJavaObject>("setData", uri);
}
}
// 启动系统设置页面
currentActivity.Call("startActivity", intent);
}
}
}
}
}
#endif
}
// 更新状态显示
private void UpdateStatus(string message)
{
if (statusText != null)
{
statusText.text = message;
}
Debug.Log(message);
}
}
Pico4ue的安卓版本为14,经测试可行
pico官网对4ue权限的申请