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í)踐
- 加載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ì)的加載。 -
String fileNames[] =context.getAssets().list("");來(lái)獲取assets/跟目錄下的所有文件和文件夾。這里發(fā)現(xiàn),安裝app之后assets/目錄下默認(rèn)有三個(gè)文件夾:images,webkit,sounds。

注意點(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)