Unity读取windows和Android SDcard文件
程序员文章站
2022-05-16 21:00:35
...
全部都是路径惹的祸
读取 windows D: 盘下的 test.txt 文件,
编辑器里运行,console上可以查看:
windows上 路径 / 要写成 \\ 写一个也不行,可能会被转义,反正也无法读取内容
string windowsUrl = "file://D:\\test.txt";
WWW w = new WWW(windowsUrl);
yield return w;
if (w.isDone)
{
Debug.Log("读取 D:盘 test文件 ==== "+w.text);
}
Androud相关的各大论坛相关文章很多,但是说的都不太清楚,所以特此记录。
log中 我打印了 Unity里面的路径,Androd上需要注意的也是 路径上的统一:
Android上获取Api提供的路径:
Log.e(TAG, "onCreate: packageName = " + this.getExternalCacheDir());
Log.e(TAG, "onCreate: packageName = " + this.getExternalFilesDir(""));
Log.e(TAG, "onCreate: packageName = " + this.getCacheDir());
Log.e(TAG, "onCreate: packageName = " + this.getPackageName());
Log.e(TAG, "onCreate: packageName = " + Environment.getDataDirectory());
Log.e(TAG, "onCreate: packageName = " + Environment.getDataDirectory().getAbsolutePath());
Log.e(TAG, "onCreate: packageName = " + Environment.getExternalStorageDirectory());
IO方式 加载sdcard上的图片资源
加载的 /storage/emulated/0/ProjectName/Image/avatar/20170523_164417.jpg,
image = this.GetComponentInChildren<Image>();
Debug.Log("IO加载用时: image = this.GetComponent<Image> ========== " + image);
Debug.Log("IO加载: Application.dataPath " + Application.dataPath );
// Application.dataPath /data/app/com.putao.ptx.core-1/base.apk
Debug.Log("IO加载: Application.persistentDataPath " + Application.persistentDataPath);
// Application.persistentDataPath /storage/emulated/0/Android/data/com.putao.ptx.core/files
Debug.Log("IO加载:GameObject.Find" + GameObject.Find("Canvas/Avator").GetComponent<Image>());
// /data/user/0/com.putao.paichallenge/cache/20170524_130527.jpg
// path ======= "/storage/emulated/0/ProjectName/Image/avatar/20170523_164417.jpg"
FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
fileStream.Seek(0, SeekOrigin.Begin);
//创建文件长度缓冲区
byte[] bytes = new byte[fileStream.Length];
//读取文件
fileStream.Read(bytes, 0, (int)fileStream.Length);
//释放文件读取流
fileStream.Close();
fileStream.Dispose();
fileStream = null;
//创建Texture
int width = 300;
int height = 372;
Texture2D texture = new Texture2D(width, height);
texture.LoadImage(bytes);
//创建Sprite
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width,texture.height), new Vector2(0.5f, 0.5f));
image.sprite = sprite;
log上可以看出来 android上 getExternalFilesDir("") 和 Unity里面的Application.persistentDataPath是一致的
/storage/emulated/0/Android/data/com.putao.ptx.core/files
WWW方式加载本地图片
url= "file://"+
"/storage/emulated/0/ProjectName/Image/avatar/20170523_164417.jpg"
根本不是加"jar:file://"。。。某些博主根本就不试试么,瞎写。
public void LoadByWWW(String path)
{
StartCoroutine(doLoadByWWW(path));
}
IEnumerator doLoadByWWW(String path)
{
string url = "file://" + "/storage/emulated/0/PaiChallenge/Image/avatar/20170523_164417.jpg";
Debug.Log("doLoadByWWW == url ================== " + url);
WWW w = new WWW(url);
yield return w;
if (w.isDone)
{
Sprite sprite = Sprite.Create(w.texture, new Rect(0, 0, w.texture.width, w.texture.height), new Vector2(0.5f, 0.5f));
GameObject.Find("Canvas/Avator").GetComponent<Image>().sprite = sprite;
}
还有 就是权限问题的添加 :Player settings -- Other settings -- write permission的设置 Sdcard。这个是在Unity编辑器里打包的情况。
如果导出到studio 里面的话,可自行修改Manifest文件。
下一篇: Android sdcard文件读写操作
推荐阅读
-
Android中没有插入SD情况下的文件写入和读取方法
-
Android中没有插入SD情况下的文件写入和读取方法
-
android读取sdcard路径下的文件的方法
-
解决Android10读取不到/sdcard/、/storage/emulated/0/文件的问题
-
Android 系统 -- 使用Xshell在Windows系统和Linux系统之间进行文件传输
-
Android JNI读取本地文件和读取文件并且写入其他文件
-
Android 8.0 中怎样读取内部和外部存储及外置SDcard
-
Android 文件IO流的存储和读取
-
Android 入门第七讲01-数据存储(数据存储概述,文件存储(raw和asserts目录读写,data/data/包名目录读写,sdcard目录读写),SharedPreferences读写)
-
Unity本地Json文件的创建、编辑和读取