Android讀寫(xiě)assets目錄下面的資源文件(文件夾)
Android除了提供/res目錄存放資源文件外,在/assets目錄也會(huì)提供存放資源文件,在/assets目錄下面不會(huì)在R.java里面自動(dòng)生 成ID,所以讀取assets目錄下面的資源文件需要提供路徑,我們可以通過(guò)AssetManager類(lèi)來(lái)訪問(wèn)這些文件。
作者需要實(shí)現(xiàn)從 A.apk( 資源apk ,把所有的資源如:so、apk、可執(zhí)行文件等放到assets目錄下面,apk沒(méi)有實(shí)現(xiàn)邏輯代碼)拷貝資源到指定目錄下,所以作者創(chuàng)建了一個(gè)實(shí)現(xiàn)資源拷貝邏輯的 B.apk( 一個(gè)Service,也可用Activity實(shí)現(xiàn)),由于拷貝路徑一般情況下 是不可訪問(wèn)或者創(chuàng)建的(每個(gè)apk安裝之后只能訪問(wèn)/data/data/自己包名/下面的私有空間),作者需要這個(gè)apk能夠獲取系統(tǒng)權(quán)限 (System權(quán)限),則必須在AndroidManifest.xml聲明shareduserid,具體如何操作下一節(jié)進(jìn)行記錄。
一、AssetManager讀取文件常用的幾個(gè)API
1.文件讀取方式
AssetManager.open(String filename),返回的是一個(gè)InputSteam類(lèi)型的字節(jié)流,這里的filename必須是文件,而不能是文件夾,AssetManager打開(kāi) 資源文件的open方法是一個(gè)重載方法,可以添加一個(gè)打開(kāi)方式的int參數(shù),根據(jù)參數(shù)不同可做相應(yīng)操作。具體請(qǐng)看官方文檔http://web.mit.edu/clio/MacData/afs/sipb/project/android/docs/reference/android/content/res/AssetManager.html
2.資源文件是可以存在文件夾以及子目錄
public final String[]list(String path),返回當(dāng)前目錄下面的所有文件以及子目錄的名稱(chēng)??梢酝ㄟ^(guò)遞歸遍歷整個(gè)文件目錄,實(shí)現(xiàn)所有資源文件的訪問(wèn)。String[] Array of strings, one for each asset. These file names are relative to 'path'. You can open the file by concatenating 'path' and a name in the returned string (via File) and passing that to open().
二、相關(guān)實(shí)現(xiàn)代碼
資源APK(A.apk)
具體實(shí)現(xiàn)代碼片段,由于使用系統(tǒng)權(quán)限,生成的路徑可以自己改一下B.apk
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- try {
- ctxDealFile = this.createPackageContext("com.zlc.ipanel",
- Context.CONTEXT_IGNORE_SECURITY);
- } catch (NameNotFoundException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- btn3.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- try {
- String uiFileName = "ipanelJoin";
- deepFile(ctxDealFile, uiFileName);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- textView.setText("file is wrong");
- }
- }
- });
- //
- }
- public void deepFile(Context ctxDealFile, String path) {
- try {
- String str[] = ctxDealFile.getAssets().list(path);
- if (str.length > 0) {//如果是目錄
- File file = new File("/data/" + path);
- file.mkdirs();
- for (String string : str) {
- path = path + "/" + string;
- System.out.println("zhoulc:\t" + path);
- // textView.setText(textView.getText()+"\t"+path+"\t");
- deepFile(ctxDealFile, path);
- path = path.substring(0, path.lastIndexOf('/'));
- }
- } else {//如果是文件
- InputStream is = ctxDealFile.getAssets().open(path);
- FileOutputStream fos = new FileOutputStream(new File("/data/"
- + path));
- byte[] buffer = new byte[1024];
- int count = 0;
- while (true) {
- count++;
- int len = is.read(buffer);
- if (len == -1) {
- break;
- }
- fos.write(buffer, 0, len);
- }
- is.close();
- fos.close();
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
介紹到這大家也應(yīng)該對(duì)Android讀寫(xiě)assets目錄下面的資源文件有了一定的理解了,希望對(duì)大家有所幫助。