Unity讀取Android外部文件的實(shí)現(xiàn)
最近近到個(gè)小需求,需要讀Android件夾中的圖片.在這里做一個(gè)記錄.
首先讀寫(xiě)部分,這里以圖片為例子:
一讀寫(xiě)部分
寫(xiě)入部分:需要注意的是因?yàn)橹挥羞@個(gè)地址支持外部讀寫(xiě),所以這里用到的地址都以 :Application.persistentDataPath為地址起始.
private Texture2D __CaptureCamera()
{
RenderTexture rt = m_renGet;
RenderTexture.active = rt;
Texture2D screenShot = new Texture2D(256, 256, TextureFormat.RGB24, false);
screenShot.ReadPixels(new Rect(0, 0, 256, 256), 0, 0);
screenShot.Apply();
byte[] bytes = screenShot.EncodeToPNG();
string filename = Application.persistentDataPath + "/House1.jpg";
System.IO.File.WriteAllBytes(filename, bytes);
return screenShot;
}
讀取部分:為了方便測(cè)試這里使用了InputFiled組件為了方便隨時(shí)調(diào)整地址:
private void __On3()
{
input.text = Application.persistentDataPath;
string path = "file:///" + input.text;
StartCoroutine(LoadImage(path, bb));
}
private void bb(object obj)
{
Texture2D tex = obj as Texture2D;
rw.texture = tex;
}
public IEnumerator LoadImage(string path, Action<object> callback)
{
Debug.Log("讀取地址:"+path);
using (WWW www = new WWW(path))
{
yield return www;
if (www.error != null)
{
if (callback != null)
{
//加載失敗將加載本地默認(rèn)圖片
//callback(Resources.Load(AssetPathConfig.DEFAULT_IMAGE) as Texture2D);
//Debug.Log("失敗");
Debug.Log("失敗");
}
}
else
{
if (www.isDone)
{
if (callback != null)
{
Debug.Log("成功");
callback(www.texture);
}
}
}
}
}
二權(quán)限申請(qǐng)
權(quán)限獲取分為三個(gè)部分
版本設(shè)置需要將Android調(diào)整到較高版本(不一定)

外部讀寫(xiě)設(shè)置然后是將Project Setting > OtherSettings > Write permission 設(shè)置為 Extemal(SDCard)
使用可以方位指定文件夾外的文件

權(quán)限配置然后勾選Project Setting > Publishing Settings > Build > Custom Main Manifest
此時(shí)將在自動(dòng)在Plugins 下生成Android/AndroidManifest文件

在些可添加額外的權(quán)限

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
申請(qǐng)權(quán)限只需要在游戲開(kāi)始調(diào)用RequestPermissions方法即可完成權(quán)限申請(qǐng)
//申請(qǐng)多個(gè)權(quán)限
private void RequestPermissions()
{
if (m_StringBuilder == null)
{
m_StringBuilder = new StringBuilder();
}
else
{
m_StringBuilder.Clear();
}
m_IsGetAllPermission = false;
//申請(qǐng)回調(diào)
m_PermissionCallbacks = new PermissionCallbacks();
m_PermissionCallbacks.PermissionDenied += OnPermissionDenied;
m_PermissionCallbacks.PermissionGranted += OnPermissionGranted;
m_PermissionCallbacks.PermissionDeniedAndDontAskAgain += OnPermissionDeniedAndDontAskAgain;
//申請(qǐng)權(quán)限組
string[] permissions =
{
Permission.ExternalStorageRead,
Permission.ExternalStorageWrite,
// 添加其他權(quán)限
};
//執(zhí)行申請(qǐng)多個(gè)權(quán)限
Permission.RequestUserPermissions(permissions, m_PermissionCallbacks);
}
//申請(qǐng)權(quán)限被拒絕
private void OnPermissionDenied(string permission)
{
Debug.Log($"OnPermissionDenied:{permission}");
}
//申請(qǐng)權(quán)限成功
/// <param name="permission"></param>
private void OnPermissionGranted(string permission)
{
Debug.Log($"OnPermissionGranted:{permission}");
//檢查權(quán)限是否全部通過(guò)
if (Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) &&
Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
//防止多次回調(diào)
if (!m_IsGetAllPermission)
{
m_IsGetAllPermission = true;
//在這里處理權(quán)限通過(guò)的邏輯
//do something
Debug.Log("權(quán)限申請(qǐng)全部通過(guò)");
}
}
}
//申請(qǐng)權(quán)限被拒絕,且不再詢(xún)問(wèn)
private void OnPermissionDeniedAndDontAskAgain(string permission)
{
Debug.Log ($"OnPermissionDeniedAndDontAskAgain:{permission}");
}
三測(cè)試

此時(shí)我在手機(jī)根目錄下放一張圖片22.jpg
我們讀取地址 “file:///” + Application.persistentDataPath + “/…/…/…/…/22.jpg”
即可以獲得此照片../是上一級(jí)目錄的意思.

到此這篇關(guān)于Unity讀取Android外部文件的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Unity讀取Android外部文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android集成Unity的兩種方案
- android studio集成unity導(dǎo)出工程的實(shí)現(xiàn)
- 強(qiáng)制去除Unity自動(dòng)添加的Android隱私權(quán)限
- Unity同步/異步調(diào)用Android的方法實(shí)例
- Android實(shí)現(xiàn)Unity3D下RTMP推送的示例
- unity android設(shè)備上查看log輸出方式
- AndroidStudio接入U(xiǎn)nity工程并實(shí)現(xiàn)相互跳轉(zhuǎn)的示例代碼
- Android內(nèi)嵌Unity并實(shí)現(xiàn)互相跳轉(zhuǎn)的實(shí)例代碼
相關(guān)文章
Flutter如何通過(guò)一行命令解決多個(gè)pubspec.yaml文件的依賴(lài)項(xiàng)問(wèn)題
這篇文章主要介紹了Flutter如何通過(guò)一行命令解決多個(gè)pubspec.yaml文件的依賴(lài)項(xiàng)問(wèn)題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Android 自定義 View 中使用 Spannable的實(shí)例詳解
這篇文章主要介紹了Android 自定義 View 中使用 Spannable的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
ListView嵌套GridView使用詳解及注意事項(xiàng)
ListView嵌套GridView即ListView的每個(gè)Item中都包含一個(gè)GridView;需要注意的是由于ListView和GridView都是可滑動(dòng)的控件. 所以需要自定義GridView,重寫(xiě)其onMeasure()方法2013-06-06
Android開(kāi)發(fā)實(shí)現(xiàn)Launcher3應(yīng)用列表修改透明背景的方法
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)Launcher3應(yīng)用列表修改透明背景的方法,結(jié)合實(shí)例形式分析了Launcher3相關(guān)配置文件與功能函數(shù)修改設(shè)置操作技巧,需要的朋友可以參考下2017-11-11
android View 繪制完成監(jiān)聽(tīng)的實(shí)現(xiàn)方法
今天小編就為大家分享一篇android View 繪制完成監(jiān)聽(tīng)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Android activity實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)功能
Activity是一個(gè)Android的應(yīng)用組件,它提供屏幕進(jìn)行交互。今天通過(guò)本文給大家介紹Android activity實(shí)現(xiàn)延時(shí)跳轉(zhuǎn)功能,感興趣的朋友一起看看吧2021-06-06
TabLayout+ViewPager實(shí)現(xiàn)切頁(yè)的示例代碼
這篇文章主要介紹了TabLayout+ViewPager實(shí)現(xiàn)切頁(yè)的示例代碼,可實(shí)現(xiàn)左右滑動(dòng)切換視圖界面和點(diǎn)擊切換,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2019-01-01
實(shí)例講解Android多線程應(yīng)用開(kāi)發(fā)中Handler的使用
這篇文章主要介紹了Android多線程應(yīng)用開(kāi)發(fā)中Handler的使用,Handle主要被用來(lái)更新UI和處理消息,需要的朋友可以參考下2016-01-01

