You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:35:37