如何为运行在 PICO 4 Ultra 设备上的项目设置外部文件读写权限?

PICO 4 Ultra 系列设备使用的安卓操作系统为 Android 14。当项目的 Write Permission 为 Externa (SDCard) 且 Android API Level 大于 32 时,Unity 提供的外部文件读取方式在 PICO 4 Ultra 设备上将失效。此问题提供两种解决方法,按实际情况选取。

解决方法一

此方法更加快捷。若无特殊要求,你可以直接在项目内使用版本小于等于 32 的 Android API。

  1. 在 Unity 编辑器内打开你的项目。
  2. 前往 Edit > Project Settings > Player > Other Settings
  3. Identification 部分,设置 Target API Level 参数,从 API Level 29 至 API Level 32 之间任选其一。

解决方法二

提示: 按照此方法申请权限后,项目内的 Project Validation 配置检测工具仍会报错,可忽略相关报错。

若你仍需要在项目内使用版本大于 32 的 Android API,则需要手动申请 MANAGE_EXTERNAL_STORAGE 权限。该权限无法直接通过 Unity 提供的 Permission.RequestUserPermission() 方法申请,参考以下步骤进行申请:

  1. 在 Unity 编辑器内打开你的项目。
  2. 前往 Project 窗口,然后在 /Assets/Plugins/Android 目录下新建一个 Java 文件。
  3. 在文件中设置包名和类名,并添加一个申请权限的方法。

代码示例如下:

java 复制代码
package packageName;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.Settings;

public class className {
    private Activity mUnityActivity;
    protected static final String TAG = "mUnityActivity";

    // 必须在 Unity 中调用,以初始化 Activity
    public void setUnityActivity(Activity unityActivity) {
        this.mUnityActivity = unityActivity;
    }

    public void requestExternalStorage() {
        // 申请权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (!Environment.isExternalStorageManager()) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                Uri uri = Uri.fromParts("package", mUnityActivity.getPackageName(), null);
                intent.setData(uri);
                mUnityActivity.startActivity(intent);
            } else {
                // 用户已经授予全盘访问权限,可以进行相关操作
            }
        } else {
            // 对于 Android 10 及更低版本,无需单独请求 MANAGE_EXTERNAL_STORAGE 权限
        }
    }
}
  1. 在 Jave 文件中实现方法后,在 Unity 中需要申请权限的部分主动调用相关方法。

以下示例中,应用启动后便申请权限:

cs 复制代码
...
void RequestStoragePermission()
{
    if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
    {
        Permission.RequestUserPermission(Permission.ExternalStorageWrite);
    }
    if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead))
    {
        Permission.RequestUserPermission(Permission.ExternalStorageRead);
    }
}
void Awake()
{
    AndroidJavaObject  javaObj = new AndroidJavaObject("packageName.className");
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    javaObj.Call("setUnityActivity", jo);
    javaObj.Call("requestExternalStorage");
    RequestStoragePermission();
}
...
  1. 前往 Edit > Project Settings > Player > Publishing Settings > Build ,勾选 Custom Main Manifest 选框。

\Assets\Plugins\Android 目录下生成 AndroidManifest.xml 文件。

  1. 在 AndroidManifest.xml 文件中添加以下用户权限内容:

    XML 复制代码
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
相关推荐
2601_961845421 天前
2027考研数学大纲|数一数二数三
考研·fpga开发·ar·vr·mr·oneflow
2601_957190904 天前
超元力mr无限飞车:虚实融合竞速体验,重构线下娱乐消费新生态
重构·娱乐·mr
2601_957190904 天前
超元力mr卡丁车:轻量化落地运营,适配中大型场地的新型游乐业态
大数据·人工智能·mr
HEADKON13 天前
英菲格拉替尼治疗胆管癌FGFR2融合患者的客观缓解率
mr
2601_957190901 个月前
MR卡丁车:虚实融合,重新定义线下竞速娱乐新体验
娱乐·mr
水火既济__1 个月前
大数据hive_mr压缩问题
大数据·hive·mr
郑寿昌1 个月前
2026年MR交互革命:事件相机重塑手势眼动同步
数码相机·mr
郑寿昌1 个月前
2026年MR框架对事件相机支持前瞻
数码相机·mr
Soari1 个月前
三菱伺服放大器MR-JET-10G配置教程
mr·伺服驱动器·mr-jet
Soari1 个月前
三菱伺服放大器MR-JET-10G轴写校验错误
mr·伺服驱动器