当前位置: 首页 > article >正文

如何为运行在 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. 在文件中设置包名和类名,并添加一个申请权限的方法。

代码示例如下:

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 中需要申请权限的部分主动调用相关方法。

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

...
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 文件中添加以下用户权限内容:
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    


http://www.kler.cn/a/456260.html

相关文章:

  • pdf有密码,如何实现pdf转换word?
  • 易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med
  • 在K8S中,nodePort的externalTrafficPolicy字段有什么作用?
  • Vue.js组件开发-如何实现vueFLow流程
  • pyqt6 OpenCV相关练习
  • 【信息系统项目管理师】高分论文:论信息系统项目的资源管理(移动警务通系统)
  • 如何在 Ubuntu 22.04 上安装 Elasticsearch
  • 【Maven】聚合与继承
  • 算法论文/目标检测4——介绍DETR家族到DINO的发展史
  • Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)
  • 探索 .idea 文件夹:Java Maven 工程的隐形守护者
  • Java连接HANA数据库
  • 腾讯音乐:说说Redis脑裂问题?
  • MYSQL访问控制,第2阶段:请求验证
  • 【数据仓库】spark大数据处理框架
  • springboot整合log4j2案例以及异常输出格式案例2
  • RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 使用Ollama添加大模型
  • Springboot配置嵌入式服务器
  • vue Promise使用
  • 什么是缓存穿透、缓存击穿、缓存雪崩,在项目中是如何解决和预防?它们分别会带来什么危害?