2017-07-31 11 views
0

私はres/rawで見つかったサウンドファイルのすべてについてMediaPlayerインスタンスを初期化したい:/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、例えばbutton2をクリックした場合:

player.get(1).start();

質問:どのように私は動的にアプリケーションの初期化中にR.raw.*ファイルを得ることができますか?


アップデート:以下は非常に近いですが、2つの問題があります。

1)例えば一つだけのファイル「test.mp3は」私の/res/rawフォルダに配置されている場合は、関数は3つのファイルを示しています。 2)どうすればこれらのファイルをメディアプレーヤーに読み込むことができますか?

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

check [android-how-do-can-i-get-a-all-files-in-a-folder](https://stackoverflow.com/questions/6539715/android-how-フォルダ内のすべてのファイルのリストを取得することができます) – ELITE

+0

@ELITEこれは、上記のように3つのファイルを提供します。しかし、私は1つしか持っていません... – 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()'とは何ですか?私はこれが/ rawファイルのリストを本当に返すのか疑問です。少なくとも 'getAssets()。list("/raw ")'はしません! – membersound

0

として解く瞬間について次のようになりますが、ちょっとハッキリと感じます:

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

CommonsWareのanswerは、下書きされていますが、包括的です。あなたができる最善の方法は、反映によって生のフィールドを繰り返し処理することです。非リソースフィールドを見つけたら、手動でそれらを破棄する必要があります(私はあなたが答えでそれをしたのを見ます)。

ワンポイント:rawディレクトリ内のファイルを置くことは開発時間中に行われ、かつrawリソース上で反復をプログラミングも開発時間中に行われます。 実行時間にあるファイルを見つけ出すのではなく、コンパイルする前に解決しなければならない問題です。つまり、コードに名前でファイルをリストする必要があります。

関連する問題