此问题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;
}