Android 中資源分為兩種,一種是res下可編譯的資源檔案, 這種資源檔案系統會在R.Java裡面自動生成該資源檔案的ID,通路也很簡單,隻需要調用R.XXX.id即可;第二種就是放在assets檔案夾下面的原生資源檔案,放在這個檔案夾下面的檔案不會被R檔案編譯,是以不能像第一種那樣直接使用.Android提供了一個工具類,友善我們操作擷取assets檔案下的檔案:AssetManager
AssetManager
AssetManager提供了如下方法用于處理assets
String[] list(String path);//列出該目錄下的下級檔案和檔案夾名稱
InputStream open(String fileName);//以順序讀取模式打開檔案,預設模式為ACCESS_STREAMING
InputStream open(String fileName, int accessMode);//以指定模式打開檔案。讀取模式有以下幾種:
//ACCESS_UNKNOWN : 未指定具體的讀取模式
//ACCESS_RANDOM : 随機讀取
//ACCESS_STREAMING : 順序讀取
//ACCESS_BUFFER : 緩存讀取
void close()//關閉AssetManager執行個體
使用
assets目錄下主要存放四種檔案:文本檔案、圖像檔案、網頁檔案(包括html中引用的js/ccs/jpg等資源)、音頻視訊檔案,下面通過具體的案例分别來說下怎麼擷取
加載assets目錄下的網頁
webView.loadUrl("file:///android_asset/html/index.htmll");
說明:這種方式可以加載assets目錄下的網頁,并且與網頁有關的css,js,圖檔等檔案也會的加載。
加載assets目錄下的圖檔資源
InputStream is = getAssets().open(fileName);
bitmap = BitmapFactory.decodeStream(is);
ivImg.setImageBitmap(bitmap);
加載assets目錄下文本檔案
InputStream is = getAssets().open(fileName);
int lenght = is.available();
byte[] buffer = new byte[lenght];
is.read(buffer);
String result = = new String(buffer, "utf8");
加載assets目錄下音樂
// 打開指定音樂檔案,擷取assets目錄下指定檔案的AssetFileDescriptor對象
AssetFileDescriptor afd = am.openFd(music);
mPlayer.reset();
// 使用MediaPlayer加載指定的聲音檔案。
mPlayer.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
// 準備聲音
mPlayer.prepare();
// 播放
mPlayer.start();
補充下:Android中還有另外一個檔案夾raw,和assets差不多,也不會被R檔案編譯,但是raw下不能在建檔案夾,assets檔案下是可以在建檔案夾的,下面是擷取raw檔案夾下資源的方法:
InputStream is = getResources().openRawResource(R.id.filename);
将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);
}
}