PICO 4 Ultra 设备上的项目设置外部文件读写权限

此问题Pico官方已给出解决方案:
https://developer-cn.picoxr.com/document/unity/set-up-read-and-write-permission-for-pico-4-ultra/

连接的资源中有三个文件AndroidManifest.xml,FileDemo.cs,SDKApi.java
AndroidManifest.xml:压缩包中的是一个示例,最后需要用自己项目中AndroidManifest文件
FileDemo.cs:测试脚本权限请求后往本地写入文件
SDKApi.java:与android通讯的java包
需要注意的是FileDemo脚本中GetJavaObject()函数中要获取这个java包他们俩的包名要一致不然获取不到。
在这里插入图片描述
在这里插入图片描述

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

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

在这里插入图片描述
第二步:
把java文件放入 ”Assets/Plugins/Android“ 文件夹下
注意package 后面是当前java包的包名在Unity请求时需要用到!

package com.pico.vrsdk;

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 SDKApi {
    private Activity mUnityActivity;
    protected static final String TAG = "mUnityActivity";

    /**
     * Must call in unity.In order to init Activity.
     *
     * @param unityActivity
     */
    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 权限
        }
    }
}

第三步:

 void RequestStoragePermission()
    {
        if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
        {
            Permission.RequestUserPermission(Permission.ExternalStorageWrite);
        }
        if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead))
        {
            Permission.RequestUserPermission(Permission.ExternalStorageRead);
        }
    }

    private AndroidJavaObject javaObj = null;
    private AndroidJavaObject GetJavaObject(){
        if (javaObj == null){
            javaObj = new AndroidJavaObject("com.pico.vrsdk.SDKApi");
        }
        return javaObj;
    }
    private void Call_SetUnityActivity(){
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        GetJavaObject().Call("setUnityActivity", jo);
    }
    private void Start()
    {
        if (Application.platform == RuntimePlatform.Android) {
            Call_SetUnityActivity ();
        }
        GetJavaObject().Call("requestExternalStorage");
        RequestStoragePermission();

        StartCoroutine(DelayWriteToFileMethod());
    }
     IEnumerator DelayWriteToFileMethod()
    {
        yield return new WaitForSeconds(5);
        WriteToFile("av=bcde");
    }


    // 获取持久化数据路径
    // private string path = "file:///storage/emulated/0/myFile2.txt";
    private string path1 = "/sdcard/aaa/myFile9.txt";
    // 写入文件
    public void WriteToFile(string content)
    {
        Debug.LogWarning("ccccccccccccc1");
        if (!Directory.Exists("/sdcard/aaa/"))
        {
            Debug.LogWarning("ccccccccccccc2");
            Directory.CreateDirectory("/sdcard/aaa/");
        }
        if (!File.Exists(path1))
        {
            Debug.LogWarning("ccccccccccccc2.5");
            File.Create(path1);
        }

        StartCoroutine(DelayMethod(5,content));

    }

    IEnumerator DelayMethod(float delayTime,string content)
    {
        //受到TimeScale影响
        yield return new WaitForSeconds(delayTime);
        Debug.LogWarning("ccccccccccccc3");

        File.WriteAllText(path1, content);
        Debug.LogWarning("ccccccccccccc4");
        yield return new WaitForSeconds(delayTime);
        string aa=ReadFromFile();
        Debug.LogWarning("ccccccccccccc5:"+aa);
    }
    // 读取文件
    public string ReadFromFile()
    {
        if (File.Exists(path1))
        {
            return File.ReadAllText(path1);
        }
        return null;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白球滚芝麻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值