2017-07-31 106 views
0

我想初始化MediaPlayer情況下爲所有在res/raw發現聲音文件的:如何動態獲取/ res/raw中的所有媒體文件?

/res/raw/test1.mp3 
/res/raw/test2.mp3 
/res/raw/testN.mp3 

目的是點擊一個按鈕扮演不同的樣品,沒有延遲。

List<MediaPlayer> player = new ArrayList<>(); 

//TODO how to loop properly? 
for (Rawfile file : rawfiles) { 
    pl = MediaPlayer.create(getBaseContext(), R.raw.test1); 
    player.add(pl); 
} 

Lateron,如果如按鈕2點:

player.get(1).start();

問:我怎樣才能得到動態應用程序的初始化過程中R.raw.*文件?


更新:下面是相當接近,但也有2個問題:

1)如果如只有一個文件「請將test.mp3」被放置在我的文件夾/res/raw,功能顯示3個文件。 2)我怎樣才能將這些文件加載​​到mediaplayer?

public void listRaw(){ 
    Field[] fields=R.raw.class.getFields(); 
    for(int count=0; count < fields.length; count++){ 
     Log.i("Raw Asset: ", fields[count].getName()); 
    } 
} 

結果:

I/Raw Asset:: $change 
I/Raw Asset:: serialVersionUID 
I/Raw Asset:: test 
+0

檢查[android-how-do-can-i-get-a-list-of-all-files-in-a-folder](https://stackoverflow.com/questions/6539715/android-how- do-can-i-get-a-list-of-all-files-in-a-folder) – ELITE

+0

@ELITE這會給出3個文件,如上所述。但我只有一個... – membersound

回答

0

我真的忘了從哪裏獲得此,它可以複製任何方式不是我的代碼,但完美的作品:

private boolean listFiles(String path) { 
     String [] list; 
     try { 
      list = getAssets().list(path); 
      if (list.length > 0) { 
       // folder founded 
       for (String file : list) { 
        if (!listAssetFiles(path + "/" + file)) 
         return false; 
       } 
      } else { 
       //file founded 
      } 
     } catch (IOException e) { 
      return false; 
     } 
     return true; 
    } 
+0

什麼是'listAssetFiles()'?我懷疑這真的返回/原始文件的列表。至少'getAssets()。list(「/ raw」)'不! – membersound

0

爲了解決作爲時刻下面,但感覺有點hacky:

public static List<Integer> listRawMediaFiles() { 
    List<Integer> ids = new ArrayList<>(); 
    for (Field field : R.raw.class.getFields()) { 
     try { 
      ids.add(field.getInt(field)); 
     } catch (Exception e) { 
      //compiled app contains files like '$change' or 'serialVersionUID' 
      //which are no real media files 
     } 
    } 
    return ids; 
} 
0

雖然undervoted,這answer CommonsWare是全面的。你可以做的最好的是通過反射迭代原始字段。如果你發現非資源字段,你應該手動丟棄它們(我看到你在回答中做到了)。

一點:在raw目錄將文件放入期間開發時間完成,並在raw資源規劃迭代也是在開發時間完成。這是編譯前應該解決的問題,而不是在運行時間中找出哪些文件,也就是說,您應該在代碼中按名稱列出文件。

相關問題