多数のフラグメント レイアウトからこの MediaPlayer メソッドを使用したいと考えています。
生のリソースを解析するにはどうすればよいですか?
public void playSound(Uri path) throws IOException{
MediaPlayer player;
player = new MediaPlayer();
try {
player.setDataSource(path.getPath(), path);
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
player.prepare();
player.start();
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp){
mp.release();
}
});
}
現在、フラグメントからこれを使用して、生のディレクトリからmp3ファイルを解析しています。
Btn_shou.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Uri path = null;
switch (tone.getCheckedRadioButtonId())
{
case R.id.radioTone1:
path = Uri.parse("android.resource://" +getActivity().getApplicationContext().getPackageName() +"/"+R.raw.shou1);
try {
playSound(path);
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
break;
「パス」変数に問題があります。Android は、mp3 ファイルが見つからないと不平を言います。
私は最終的にこれを修正しました:
別の MediaPlayer クラスを作成します。
package com.example.FragmentTabsTutorial; import android.content.Context; import android.media.MediaPlayer; import android.net.Uri; import java.io.IOException; public class plaSnd { public void playSound(Uri path, Context context) throws IOException { MediaPlayer player; player = new MediaPlayer(); try { player.setDataSource(context, path); } catch (IOException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } player.prepare(); player.start(); player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer mp) { mp.release(); } }); }
}
2.) フラグメントから、plaSnd() クラスへのオブジェクトを作成しました。
final plaSnd pla = new plaSnd();
3.) コンテキストを格納する変数を作成しました:
final Context context = getActivity().getApplicationContext();
4.) クリックされたボタンに応じてパス変数を設定し、「コンテキスト」と「パス」を「plaSnd」クラスの playSound() メソッドに解析します。
Btn_o.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Uri path = null;
switch (tone.getCheckedRadioButtonId())
{
case R.id.radioTone1:
path = Uri.parse("android.resource://" +getActivity().getApplicationContext().getPackageName() +"/"+R.raw.o1);
try {
pla.playSound(path, context);
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
break;
これは私にとってはうまくいきましたが、おそらくもっと良い解決策があると確信しています...