Unity安卓应用存储权限在Android 11及以上版本失效求助
兼容全Android版本的Unity存储权限解决方案
问题根源
Android 11(API 30)及以上启用了分区存储机制,原有的WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限不再提供全局外部存储访问权限,Unity原生的Permission API无法正确适配这种权限逻辑变化,导致旧代码在高版本系统失效。
方案一:使用应用专属外部存储(推荐,无需权限)
如果你的文本文件不需要被其他应用访问,优先使用应用专属外部存储目录——该路径在所有Android版本下都无需申请权限,路径为Android/data/[你的包名]/files/。
Unity中可直接通过Application.persistentDataPath获取该目录,代码示例:
#if UNITY_ANDROID using System.IO; using UnityEngine; public class SaveHandler : MonoBehaviour { void SaveText() { string savePath = Path.Combine(Application.persistentDataPath, "saved_content.txt"); File.WriteAllText(savePath, "需要保存的文本内容"); } } #endif
方案二:保存到公共外部存储(需权限适配)
如果必须将文件保存到公共目录(如Download、Documents),需针对不同Android版本做权限适配:
1. AndroidManifest.xml配置调整
<!-- 适配Android 10及以下版本的存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <!-- Android 11+ 全局访问存储的特殊权限(仅必要时添加) --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- Android 10过渡适配(可选,关闭分区存储强制启用) --> <application android:requestLegacyExternalStorage="true"> <!-- 你的其他Application配置 --> </application>
2. Unity权限申请代码适配
需区分Android版本,分别处理普通权限和特殊权限:
#if UNITY_ANDROID using UnityEngine; using System.IO; using AndroidJavaClass; using AndroidJavaObject; public class StoragePermissionHandler : MonoBehaviour { private const int REQUEST_MANAGE_STORAGE = 1001; void Start() { CheckAndRequestPermission(); } void CheckAndRequestPermission() { AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); int targetSdk = currentActivity.Call<int>("getApplicationInfo").Get<int>("targetSdkVersion"); if (targetSdk >= 30) { // Android 11+ 检查特殊存储权限 AndroidJavaClass envClass = new AndroidJavaClass("android.os.Environment"); bool hasPermission = envClass.CallStatic<bool>("isExternalStorageManager"); if (!hasPermission) { // 跳转到系统设置申请权限 AndroidJavaObject intent = new AndroidJavaObject("android.content.Intent", "android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION"); intent.Call<AndroidJavaObject>("setData", AndroidJavaObject.Parse("package:" + Application.identifier)); currentActivity.Call("startActivityForResult", intent, REQUEST_MANAGE_STORAGE); } else { SaveToPublicDir(); } } else { // Android 10及以下检查普通写入权限 bool hasWritePerm = Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite); if (!hasWritePerm) { Permission.RequestUserPermissions(new string[] { Permission.ExternalStorageWrite }); } else { SaveToPublicDir(); } } } void SaveToPublicDir() { // 示例:保存到Download目录 string downloadPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "Download"); string savePath = Path.Combine(downloadPath, "public_content.txt"); File.WriteAllText(savePath, "保存到公共目录的文本内容"); } // 从设置返回后重新检查权限 void OnApplicationFocus(bool hasFocus) { if (hasFocus) CheckAndRequestPermission(); } } #endif
注意事项
MANAGE_EXTERNAL_STORAGE是特殊权限,Google Play审核严格,仅当应用确实需要全局存储访问(如文件管理器类应用)才建议使用;若仅需保存文本到公共Documents目录,可使用MediaStore API(无需特殊权限,但实现相对复杂)。
内容的提问来源于stack exchange,提问作者Panda Developments
相关产品推荐
相关产品推荐

