Unity讀取Android外部文件的實(shí)現(xiàn)
最近近到個(gè)小需求,需要讀Android件夾中的圖片.在這里做一個(gè)記錄.
首先讀寫部分,這里以圖片為例子:
一讀寫部分
寫入部分:需要注意的是因?yàn)橹挥羞@個(gè)地址支持外部讀寫,所以這里用到的地址都以 :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;
}
讀取部分:為了方便測試這里使用了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)整到較高版本(不一定)

外部讀寫設(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)限只需要在游戲開始調(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)限是否全部通過
if (Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead) &&
Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
//防止多次回調(diào)
if (!m_IsGetAllPermission)
{
m_IsGetAllPermission = true;
//在這里處理權(quán)限通過的邏輯
//do something
Debug.Log("權(quán)限申請(qǐng)全部通過");
}
}
}
//申請(qǐng)權(quán)限被拒絕,且不再詢問
private void OnPermissionDeniedAndDontAskAgain(string permission)
{
Debug.Log ($"OnPermissionDeniedAndDontAskAgain:{permission}");
}
三測試

此時(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)文章
android開發(fā)socket編程之udp發(fā)送實(shí)例分析
這篇文章主要介紹了android開發(fā)socket編程之udp發(fā)送,實(shí)例分析了Android開發(fā)socket網(wǎng)絡(luò)編程中udp發(fā)送的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
Android UI設(shè)計(jì)系列之自定義TextView屬性實(shí)現(xiàn)帶下劃線的文本框(4)
這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義TextView屬性實(shí)現(xiàn)帶下劃線的文本框,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
Android開發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二)
我們?cè)趯?shí)際開發(fā)中,有的時(shí)候需要儲(chǔ)存或者備份比較復(fù)雜的數(shù)據(jù)。這些數(shù)據(jù)的特點(diǎn)是,內(nèi)容多、結(jié)構(gòu)大,比如短信備份等,通過本文給大家介紹Android開發(fā)筆記之Android中數(shù)據(jù)的存儲(chǔ)方式(二),對(duì)android數(shù)據(jù)存儲(chǔ)方式相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01
Android 8.0不能自動(dòng)安裝APK問題的解決方法(完美適配)
這篇文章主要給大家介紹了關(guān)于Android 8.0不能自動(dòng)安裝APK問題的解決方法(完美適配),這里的自動(dòng)安裝是指下載完成后,自動(dòng)彈出安裝界面,而不是靜默安裝APK,文中介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07
Android自定義View實(shí)現(xiàn)投票進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)投票進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Android仿人人客戶端滑動(dòng)菜單的側(cè)滑菜單效果
這篇文章主要介紹了Android仿人人客戶端滑動(dòng)菜單的側(cè)滑特效實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,分享給大家供大家參考2018-05-05

