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; }
讀取部分:為了方便測(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)整到較高版本(不一定)
外部讀寫設(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}"); }
三測(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)文章
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-04Android UI設(shè)計(jì)系列之自定義TextView屬性實(shí)現(xiàn)帶下劃線的文本框(4)
這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義TextView屬性實(shí)現(xiàn)帶下劃線的文本框,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android開發(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-01Android 8.0不能自動(dòng)安裝APK問題的解決方法(完美適配)
這篇文章主要給大家介紹了關(guān)于Android 8.0不能自動(dòng)安裝APK問題的解決方法(完美適配),這里的自動(dòng)安裝是指下載完成后,自動(dòng)彈出安裝界面,而不是靜默安裝APK,文中介紹的非常詳細(xì),需要的朋友可以參考下2018-07-07Android自定義View實(shí)現(xiàn)投票進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)投票進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Android仿人人客戶端滑動(dòng)菜單的側(cè)滑菜單效果
這篇文章主要介紹了Android仿人人客戶端滑動(dòng)菜單的側(cè)滑特效實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,分享給大家供大家參考2018-05-05