Android資源系統(tǒng)(resources system)可以用來打包應用所需的圖片眠菇、XML文件以及其他非Java資源磺陡,這里來學習下另一種資源打包方式:assets沼本。
resources資源可以存儲聲音文件,比如在res/raw目錄可以保存xxx.wav文件薪捍,然后使用R.raw.xxx來獲取它笼痹。然而配喳,《Android編程權威指南》中的事例BeatBox項目,涉及到了20個多不同聲音文件處理凳干,若使用Android資源系統(tǒng)一個個處理晴裹,效率就會很低,這個時候救赐,assets就派上用場了涧团,assets可以被看作隨應用打包的微型文件系統(tǒng),支持任意層次的文件目錄結構经磅,因為這個優(yōu)點泌绣,類似游戲這樣需要加載大量圖片和聲音資源的應用通常都會使用它。下面來學習怎么讀取assets資源预厌。這里的Demo就不用書上同樣的了阿迈,為了學習assets,就自己隨意寫了個Demo配乓。
首先導入assets(創(chuàng)建assets目錄仿滔,我用AS新建一個項目,貌似是沒有自動生成assets文件夾的犹芹,因此崎页,郵件單擊app模塊,New->Folder->Assets Folder)
private static final String TAG = "AssetDemoActivity";
private static final String EXAMPLE_FOLDER = "example";
private AssetManager mAssets;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_asset_demo);
mAssets = this.getAssets();
try {
String[] examples = mAssets.list(EXAMPLE_FOLDER);
Log.i(TAG, "ALL:" + examples.length);
for (String example: examples){
Log.i(TAG, "Name:" + example);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
打印結果:assets目錄中的所有文件都會隨應用打包驴一。訪問assets需要用到AssetManager類休雌,可以從Context中獲取它,通常肝断,在訪問assets時杈曲,可以不用關心究竟使用哪個Context對象,實際開發(fā)中胸懈,所有Context中的AssetManager管理的都是同一套assets資源担扑。AssetsManager.list(String)方法能列出指定目錄中的所有文件名。
當然要得到assets中資源的內容趣钱,就要用到文件讀取的技術了涌献,首先要得到資源文件的路徑嘍,上述Demo得到路徑的方式:
String assetPath = EXAMPLE_FOLDER + "/" + example;
InputStream assetData = mAssets.open(assetPath);
得到標準的InputStrem數(shù)據流首有,然后燕垃,就該怎么用就怎么用啦枢劝,有的API可能還會需要FileDescriptor。改調用AssetManager.openFd(String)方法就可以了卜壕。
深入理解:什么是non-assets
AssetManager類還有openNonAssetFd(...)這樣的方法呈野。Android有assets和resources兩大資源系統(tǒng)。resources資源系統(tǒng)設計有良好的檢索系機制印叁,但它無法應付圖形和聲音文件這樣的大文件。這些資源實際是保存在assets系統(tǒng)里的军掂。在后臺轮蜕,Android就是使用openNonAsset方法來打開這些資源。