package com.example.android.recipe061; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.SoundPool; import android.media.MediaPlayer.OnPreparedListener; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class Recipe061 extends Activity { private MediaPlayer mMediaPlayer; private static final int MAX_SOUND_COUNT = 5; private SoundPool mSoundPool; private int[] mSounds = new int[MAX_SOUND_COUNT]; // Prepared状態がMediaPlayerから取得できないので // 自前で管理するためのフラグ private boolean isPrepared = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onUntanButton(View v) { mSoundPool.play(mSounds[0], 1.0F, 1.0F, 0, 0, 1.0F); } public void onUntanHighButton(View v) { mSoundPool.play(mSounds[0], 1.0F, 1.0F, 0, 0, 2.0F); } public void onUntanLowButton(View v) { mSoundPool.play(mSounds[0], 1.0F, 1.0F, 0, 0, 0.5F); } // ホームボタンで閉じて戻ってきた時に // MediaPlayerを正しい状態にしてあげるため // onCreateではなくonResumeで準備する @Override public void onResume() { super.onResume(); mMediaPlayer = MediaPlayer.create(this, R.raw.sample); mMediaPlayer.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { isPrepared = true; // 準備ができて自動的に再生したいなら、ここでstartメソッドを呼ぶ // mp.start(); } }); mSoundPool = new SoundPool(MAX_SOUND_COUNT, AudioManager.STREAM_MUSIC, 0); mSounds[0] = mSoundPool.load(this, R.raw.sample, 1); } // ホームボタンを押された時も解放するために // onDestroyではなくonPauseでrelease()する @Override public void onPause() { super.onPause(); mMediaPlayer.release(); mSoundPool.release(); } public void onStartButton(View view) { if (isPrepared) { mMediaPlayer.start(); } else { Toast.makeText(this, "音声ファイルをロード中でやんす", Toast.LENGTH_LONG).show(); } } public void onPauseButton(View view) { if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); } } public void onStopButton(View view) { if (!mMediaPlayer.isPlaying()) { return; } mMediaPlayer.stop(); isPrepared = false; // もう一度再生されるために準備しておく try { // prepareAsync()ではなくてprepare()を呼ぶと // stopping状態にprepare()が要求されて // java.lang.IllegalStateExceptionが発生する mMediaPlayer.prepareAsync(); } catch (IllegalStateException e) { e.printStackTrace(); } } }