Android Resources之a(chǎn)ssets

Assets資源

assets/和res/raw目錄

相同之處

兩者目錄下的文件在打包后會(huì)原封不動(dòng)的保存在apk包中,不會(huì)被編譯成二進(jìn)制,這些文件將被打包到APK中應(yīng)用使用。

不同之處

  • res/raw中的文件會(huì)被映射到R.java文件中,訪問(wèn)的時(shí)候直接使用資源ID即R.id.filename;assets文件夾下的文件不會(huì)被映射到R.java中,訪問(wèn)的時(shí)候需要AssetManager類。
  • res/raw不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu),也就是assets目錄下可以再建立文件夾

因?yàn)橄到y(tǒng)在編譯的時(shí)候不會(huì)編譯assets下的資源文件,所以我們不能通過(guò)R.XXX.ID的方式訪問(wèn)它們。而且不能通過(guò)該資源的絕對(duì)路徑去訪問(wèn)它們。因?yàn)閍pk安裝之后會(huì)放在/data/app/**.apk目錄下,以apk形式存在,asset/res和被綁定在apk里,并不會(huì)解壓到/data/data/YourApp目錄下去,所以我們無(wú)法直接獲取到assets的絕對(duì)路徑,因?yàn)樗鼈兏揪蜎](méi)有。

res/raw目錄

訪問(wèn)res/raw目錄下文件的原始數(shù)據(jù)

InputStream is = getResources().openRawResource(R.id.filename);

assets/目錄

創(chuàng)建assets/目錄

  • 直接在src/main/路徑下創(chuàng)建assets文件夾
  • Project選中project模式,選中app文件夾,工具欄選擇File > New > Folder > Assets Folder

AssetManager

AssetManager提供對(duì)應(yīng)用程序的原始資源文件進(jìn)行訪問(wèn);這個(gè)類提供了一個(gè)低級(jí)別的API,它允許你以簡(jiǎn)單的字節(jié)流的形式打開(kāi)和讀取和應(yīng)用程序綁定在一起的原始資源文件。

獲取AssetManager示例

可以通過(guò)Context.getAssets()來(lái)獲取AssetManager示例。

AssetManager常用方法

public Method 描述
String[] list(String path) 返回指定路徑下的所有文件及目錄名。
InputStream open(String fileName) 使用 ACCESS_STREAMING模式打開(kāi)assets下的指定文件。
InputStream open(String fileName, int accessMode) 使用指定的訪問(wèn)模式打開(kāi)assets下的指定文件.

當(dāng)調(diào)用open()來(lái)創(chuàng)建一個(gè)InputStream流時(shí),fileName參數(shù)必須是文件,不能是文件夾。open方法是以assets目錄為根的。

實(shí)踐

  1. 加載assets/目錄下的html文件:webView.loadUrl("file:///android_asset/win8_Demo/index.html");.Android SDK制定了URI:file:///android_asset/ + 文件路徑來(lái)表示assets/目錄下文件的絕對(duì)路徑。這種方式可以加載assets目錄下的網(wǎng)頁(yè),并且與網(wǎng)頁(yè)有關(guān)的css,js,圖片等文件也會(huì)的加載。
  2. String fileNames[] =context.getAssets().list("");來(lái)獲取assets/跟目錄下的所有文件和文件夾。這里發(fā)現(xiàn),安裝app之后assets/目錄下默認(rèn)有三個(gè)文件夾:images,webkit,sounds。
assets dir.png

注意點(diǎn)

調(diào)用close()時(shí)機(jī)

當(dāng)我們?cè)陧?xiàng)目中調(diào)用AssetManager.close()時(shí),程序會(huì)終止并報(bào)錯(cuò):Assetmanager has been closed

這是因?yàn)椋恳粋€(gè)APK文件在進(jìn)程中都對(duì)應(yīng)有一個(gè)全局的Resourses對(duì)象以及一個(gè)全局的AssetManager對(duì)象。其中,這個(gè)全局的Resourses對(duì)象保存在一個(gè)對(duì)應(yīng)的ContextImpl對(duì)象的成員變量mResources中,而這個(gè)全局的AssetManager對(duì)象保存在這個(gè)全局的Resourses對(duì)象的成員變量mAssets中。

問(wèn)題

  • URI怎么轉(zhuǎn)換成文件路徑
  • res/raw/目錄下的資源怎么通過(guò)URI來(lái)訪問(wèn)

參考

Android開(kāi)發(fā)之a(chǎn)ssets目錄下資源使用總結(jié)

Android Studio 添加Assets目錄

java.lang.RuntimeException: Assetmanager has been closed

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容