1. 程式人生 > >Android開發之assets目錄下資源使用總結

Android開發之assets目錄下資源使用總結

[] != 大致 pac 模式 uri bsp 文件夾 block

預前知識:

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目錄下的網頁,並且與網頁有關的cssjs,圖片等文件也會的加載。

技術分享圖片

2.訪問assets目錄下的資源文件:

AssetManager.open(String filename),返回的是一個InputSteam類型的字節流,這裏的filename必須是文件比如

(aa.txt;img/semll.jpg),而不能是文件夾。

3.獲取assets的文件及目錄名:

//獲取assets目錄下的所有文件及目錄名,content(當前的上下文如ActivityServiceContextWrapper的子類的

都可以)

String fileNames[] =context.getAssets().list(path);

4.將assets下的文件復制到SD卡:

[java] view plain copy print?
  1. /**
  2. * 從assets目錄中復制整個文件夾內容
  3. * @param context Context 使用CopyFiles類的Activity
  4. * @param oldPath String 原文件路徑 如:/aa
  5. * @param newPath String 復制後路徑 如:xx:/bb/cc
  6. */
  7. public void copyFilesFassets(Context context,String oldPath,String newPath) {
  8. try {
  9. String fileNames[] = context.getAssets().list(oldPath);//獲取assets目錄下的所有文件及目錄名
  10. if (fileNames.length > 0) {//如果是目錄
  11. File file = new File(newPath);
  12. file.mkdirs();//如果文件夾不存在,則遞歸
  13. for (String fileName : fileNames) {
  14. copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);
  15. }
  16. } else {//如果是文件
  17. InputStream is = context.getAssets().open(oldPath);
  18. FileOutputStream fos = new FileOutputStream(new File(newPath));
  19. byte[] buffer = new byte[1024];
  20. int byteCount=0;
  21. while((byteCount=is.read(buffer))!=-1) {//循環從輸入流讀取 buffer字節
  22. fos.write(buffer, 0, byteCount);//將讀取的輸入流寫入到輸出流
  23. }
  24. fos.flush();//刷新緩沖區
  25. is.close();
  26. fos.close();
  27. }
  28. } catch (Exception e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. //如果捕捉到錯誤則通知UI線程
  32. MainActivity.handler.sendEmptyMessage(COPY_FALSE);
  33. }
  34. }
技術分享圖片技術分享圖片

5.使用assets目錄下的圖片資源:

[java] view plain copy print?
  1. InputStream is=getAssets().open("wpics/0ZR424L-0.jpg");
  2. Bitmap bitmap=BitmapFactory.decodeStream(is);
  3. imgShow.setImageBitmap(bitmap);
技術分享圖片

6.播放assets目錄下的音樂

首先,獲取通過openFd()的方法獲取asset目錄下指定文件的AssetFileDescriptor對象

其次,通過MediaPlayer對象的setDataSource (FileDescriptorfd, longoffset, long length)方法加載音樂文件。

最後,調用prepare方法準備音樂,start方法開始播放音樂。

預備知識:

AssetFileDescriptor簡介:

在AssetManager中一項的文件描述符。這提供你自己打開的FileDescriptor可用於讀取的數據,以及在文件中的

偏移量和長度的該項的數據。

可以通過AssetManageropenFd()的方法獲取asset目錄下指定文件的AssetFileDescriptor對象。

常用方法:

Public Methods

FileInputStream

createInputStream()

為asset創建並返回一個自動關閉的輸入流。

FileOutputStream

createOutputStream()

為asset創建並返回一個自動關閉的輸出流。

FileDescriptor

getFileDescriptor()

返回可用於讀取文件中的數據的FileDescriptor對象。

long

getLength()

返回該asset中項的數據的總字節數。

long

getStartOffset()

返回asset中項的數據字節開始偏移。

具體代碼:

[java] view plain copy print?
  1. // 打開指定音樂文件,獲取assets目錄下指定文件的AssetFileDescriptor對象
  2. AssetFileDescriptor afd = am.openFd(music);
  3. mPlayer.reset();
  4. // 使用MediaPlayer加載指定的聲音文件。
  5. mPlayer.setDataSource(afd.getFileDescriptor(),
  6. afd.getStartOffset(), afd.getLength());
  7. // 準備聲音
  8. mPlayer.prepare();
  9. // 播放
  10. mPlayer.start();

Android開發之assets目錄下資源使用總結