0

多数のフラグメント レイアウトからこの 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 ファイルが見つからないと不平を言います。

私は最終的にこれを修正しました:

  1. 別の 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;

これは私にとってはうまくいきましたが、おそらくもっと良い解決策があると確信しています...

4

1 に答える 1