天天看點

android 對于asset下檔案的操作

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);  
    }                             
}