如何为运行在 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" />
相关推荐
小杨小杨11 天前
Lifespan Brain MR 图像分割的知识引导式提示学习
学习·mr
岱宗夫up2 天前
探秘虚拟与现实的融合:VR、AR、MR 技术的变革力量
ar·vr·mr
罗小罗同学7 天前
国自然面上项目|基于多模态MR影像的胶质母细胞瘤高危区域定位及预后预测研究|基金申请·25-02-28
人工智能·深度学习·mr·影像组学·医学人工智能
小技工丨8 天前
MR-图解
hadoop·mr
MediaTea16 天前
Ae 效果详解:CC Mr. Mercury
mr
YY-nb24 天前
【2025 Unity Meta Quest MR 开发教程】透视 Passthrough 模块配置(戴上头显看见现实画面)
unity·游戏引擎·mr
Channing Lewis2 个月前
在使用 GitLab API 时,如果只能获取少量的 Merge Request(MR)信息,而没有完整的数据
gitlab·mr
Channing Lewis2 个月前
如何查看gitlab mr labels 添加和删除的历史
gitlab·mr
dzj20212 个月前
Unity发布android Pico报错——CommandInvokationFailure: Gradle build failed踩坑记录
android·unity·gradle·报错·pico
Leeuwenhoek2 个月前
2025年AI和AR谁才是智能眼镜的未来
人工智能·ai·ar·生活·mr·虚拟现实