https://www.jianshu.com/p/c5d41272c7e9 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/目錄AssetManagerAssetManager提供對(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。

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)題參考Android開(kāi)發(fā)之a(chǎn)ssets目錄下資源使用總結(jié) Android Studio 添加Assets目錄 java.lang.RuntimeException: Assetmanager has been closed 作者:獅_子歌歌 鏈接:https://www.jianshu.com/p/c5d41272c7e9 來(lái)源:簡(jiǎn)書(shū) 著作權(quán)歸作者所有。非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
|