androidStudio音を出す。
 
音を出すしたい場合。2種類あって
いや、本当は3種類あるみたいだけど。
 
自分の本に書いてあるのは2種類だったので、こちらで。
 SoundPoolとMediaPlayerがあるんだけど。
 
SoundPoolが連続再生するとそのうち再生されなくなり。
調子悪し。・・・・いろいろ調整したけど無理っぽい。
 
MediaPlayerはうまく動くみたいなのでこれで行く。
といっても、停止→再生を繰り返すと、ぷちっと音が入るのが気に入らないが、
まずはこれで実装しましょう。
 
仕様上は停止しないので問題ないので、連続でイベント発生しない場合は、ほぼ問題ないと思われ。
いつものようにプロジェクト作成はBasicActivityで作っていきました。
 
まず、音源をresに入れていきます。
左上のProjectの所、普段Androidになっている選択をProjectに変更して、
app→src→main→resの配下にrawディレクトリを作って
 音源ファイルをコピーしてください。
今回その名前をbgm.mp3とse.wavにしています。
 

 
 
そして、音源の再生ボタンと停止ボタンを作っていってください。
普通はFirstFragmentの中でボタンを実装しますので、
その手順で行きます。
いつものようにGUIでresのflagment_first修正して
再生用ボタンと停止用ボタンを作ります。
名前をtest_buttonとtest_button2としています。
 
FirstFragmentクラスに以下の様にMediaPlayerの変数を追加します。
    private MediaPlayer mediaPlayer=null;
そしてFirstFlagmentのonViewCreatedの中で以下を追加してボタンの応答を受けられるようにします。
 
binding.testButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.d("TAG", "onClick: testButton start bgm");
        //stop
        if(mediaPlayer!=null) {
            mediaPlayer.pause();
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
        //start
        MainActivity activity = (MainActivity) getActivity();
        //mediaPlayer = MediaPlayer.create(activity, R.raw.bgm);
        mediaPlayer = MediaPlayer.create(activity, R.raw.se);
        mediaPlayer.setLooping(false);
        mediaPlayer.seekTo(0);
        mediaPlayer.start();
    }
});
binding.testButton2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Log.d("TAG", "onClick: testButton2 stop bgm");
        //
        if(mediaPlayer!=null) {
            mediaPlayer.stop();
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }
});
 
上のtestButtonは再生、testButton2が停止。
mediaPlayer.setLooping(false);をtrueにすると再生を繰り返す。
自分のスマホではstopの時にプチッと音が入る。
 
ちなみに、MainActivity activity = (MainActivity) getActivity();とやって、
MediaPlayer.create(activity, R.raw.se);の入力にしています。
こうすると、Fragmentからでも、mediaPlayerのthisの代わりになってくれます。
 
ただし、スマホを回転すると、Fragmenを作り直すようなので、注意です。
もしかしたら、mediaPlayer変数はMainActivityに持っておいて、初期化しておいて、
再生時にFragmentから呼び出すようにした方が良いかもしれませんね。