Android之資源打包方式——Assets
Android資源系統(resources system)可以用來打包應用所需的圖片、XML文件以及其他非Java資源,這里來學習下另一種資源打包方式:assets。
resources資源可以存儲聲音文件,比如在res/raw目錄可以保存xxx.wav文件,然后使用R.raw.xxx來獲取它。然而,《Android編程權威指南》中的事例BeatBox項目,涉及到了20個多不同聲音文件處理,若使用Android資源系統一個個處理,效率就會很低,這個時候,assets就派上用場了,assets可以被看作隨應用打包的微型文件系統,支持任意層次的文件目錄結構,因為這個優點,類似游戲這樣需要加載大量圖片和聲音資源的應用通常都會使用它。下面來學習怎么讀取assets資源。這里的Demo就不用書上同樣的了,為了學習assets,就自己隨意寫了個Demo。
首先導入assets(創建assets目錄,我用AS新建一個項目,貌似是沒有自動生成assets文件夾的,因此,郵件單擊app模塊,New->Folder->Assets Folder)
Demo截圖
跳出下圖,然后finish
Demo截圖
項目就出現了assets
Demo截圖
右鍵單擊assets目錄,這里可以將文件直接放入assets目錄下,也可以再建立一個文件夾,統一管理。我們這里建立example文件夾,放入幾個txt文件
Demo截圖
public class AssetDemoActivity extends AppCompatActivity {
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();
}
}
}
打印結果:
Demo截圖
assets目錄中的所有文件都會隨應用打包。訪問assets需要用到AssetManager類,可以從Context中獲取它,通常,在訪問assets時,可以不用關心究竟使用哪個Context對象,實際開發中,所有Context中的AssetManager管理的都是同一套assets資源。AssetsManager.list(String)方法能列出指定目錄中的所有文件名。
當然要得到assets中資源的內容,就要用到文件讀取的技術了,首先要得到資源文件的路徑嘍,上述Demo得到路徑的方式:
String assetPath = EXAMPLE_FOLDER + "/" + example;
InputStream assetData = mAssets.open(assetPath);
得到標準的InputStrem數據流,然后,就該怎么用就怎么用啦,有的API可能還會需要FileDescriptor。改調用AssetManager.openFd(String)方法就可以了。
深入理解:什么是non-assets
AssetManager類還有openNonAssetFd(...)這樣的方法。Android有assets和resources兩大資源系統。resources資源系統設計有良好的檢索系機制,但它無法應付圖形和聲音文件這樣的大文件。這些資源實際是保存在assets系統里的。在后臺,Android就是使用openNonAsset方法來打開這些資源。
來自:http://www.jianshu.com/p/27032bba4c14