標籤:assets目錄下資源使用總結 assetmanager類簡介 載入assets目錄下的網頁 將assets下的檔案複製到sd卡 訪問assets目錄下的資源檔
預前知識:
Android資源檔分類:
Android資源檔大致可以分為兩種:
第一種是res目錄下存放的可編譯的資源檔:
這種資源檔系統會在R.java裡面自動產生該資源檔的ID,所以訪問這種資源檔比較簡單,通過R.XXX.ID即可;
第二種是assets目錄下存放的原生資源檔:
因為系統在編譯的時候不會編譯assets下的資源檔,所以我們不能通過R.XXX.ID的方式訪問它們。那我麼能不能通過該資源的絕對路徑去訪問它們呢?因為apk安裝之後會放在/data/app/**.apk目錄下,以apk形式存在,asset/res和被綁定在apk裡,並不會解壓到/data/data/YourApp目錄下去,所以我們無法直接擷取到assets的絕對路徑,因為它們根本就沒有。
還好Android系統為我們提供了一個AssetManager工具類。
查看官方API可知,AssetManager提供對應用程式的原始資源檔進行訪問;這個類提供了一個低層級的API,它允許你以簡單的位元組流的形式開啟和讀取和應用程式綁定在一起的原始資源檔。
AssetManager類概述:
提供對應用程式的原始資源檔進行訪問;這個類提供了一個低層級的API,它允許你以簡單的位元組流的形式開啟和讀取和應用程式綁定在一起的原始資源檔。通過getAssets()方法擷取AssetManager對象。
AssetManager類常用方法:
Public Methods |
final String[] |
list(String path) 返回指定路徑下的所有檔案及目錄名。 |
final InputStream |
open(String fileName) 使用 ACCESS_STREAMING模式開啟assets下的指定檔案。. |
final InputStream |
open(String fileName, int accessMode) 使用顯示的訪問模式開啟assets下的指定檔案. |
應用執行個體1.載入assets目錄下的網頁:
//載入assets/win8_Demo/目錄下的index.html網頁
webView.loadUrl("file:///android_asset/win8_Demo/index.html");
說明:這種方式可以載入assets目錄下的網頁,並且與網頁有關的css,js,圖片等檔案也會的載入。
2.訪問assets目錄下的資源檔:
AssetManager.open(String filename),返回的是一個InputSteam類型的位元組流,這裡的filename必須是檔案比如(aa.txt;img/semll.jpg),而不能是檔案夾。
3.擷取assets的檔案及目錄名:
//擷取assets目錄下的所有檔案及目錄名,content(當前的上下文如Activity,Service等ContextWrapper的子類的都可以)
String fileNames[] =context.getAssets().list(path);
4.將assets下的檔案複製到SD卡:
/** * 從assets目錄中複製整個檔案夾內容 * @param context Context 使用CopyFiles類的Activity * @param oldPath String 原檔案路徑 如:/aa * @param newPath String 複製後路徑 如:xx:/bb/cc */ public void copyFilesFassets(Context context,String oldPath,String newPath) { try { String fileNames[] = context.getAssets().list(oldPath);//擷取assets目錄下的所有檔案及目錄名 if (fileNames.length > 0) {//如果是目錄 File file = new File(newPath); file.mkdirs();//如果檔案夾不存在,則遞迴 for (String fileName : fileNames) { copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName); } } else {//如果是檔案 InputStream is = context.getAssets().open(oldPath); FileOutputStream fos = new FileOutputStream(new File(newPath)); byte[] buffer = new byte[1024]; int byteCount=0; while((byteCount=is.read(buffer))!=-1) {//迴圈從輸入資料流讀取 buffer位元組 fos.write(buffer, 0, byteCount);//將讀取的輸入資料流寫入到輸出資料流 } fos.flush();//重新整理緩衝區 is.close(); fos.close(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); //如果捕捉到錯誤則通知UI線程 MainActivity.handler.sendEmptyMessage(COPY_FALSE); } }
5.使用assets目錄下的圖片資源:
InputStream is=getAssets().open("wpics/0ZR424L-0.jpg");Bitmap bitmap=BitmapFactory.decodeStream(is);imgShow.setImageBitmap(bitmap);