Androidで音楽再生

Androidで音楽再生

アプリケーション機能

  • 上ボタンを押すとウィンドウズの警告音がなる
  • 下ボタンを押すと音楽再生
  • センターボタンを押すと音楽停止

準備

  • 適当な音楽ファイルを用意する

Andoroidのオーディオサポートフォーマット

プロジェクト概要

  • プロジェクト名:SoundSample
  • BuildTarget:sdk1.5

追加リソース

    • 「res」フォルダ以下に「raw」フォルダ
    • 「raw」フォルダ以下に「sample.mp3」ファイル


プログラム作成

MediaPlayerの作成
MediaPlayerオブジェクトをprivateで定義する

private MediaPlayer sample;

MediaPlayerのインスタンス作成し、sample.mp3で初期化

this.sample = MediaPlayer.create(this, R.raw.sample);

音楽の再生処理
onKeyDownメソッドをオーバーライドし、ローカルMediaPlayerオブジェクトを定義する。
※特にローカルで定義する必要はないが、複数の音楽の同時に再生に対応させるためここではローカル変数を用意した

MediaPlayer mp;

各キーに対応したコードを記述

  • 上下ボタンで再生する音楽を決定
    • 上:警告音
    • 下:適当な音楽
  • seekTo()で音楽ファイルの先頭にまき戻しを行う
  • start()メソッドで再生開始
  • stop()メソッドで停止する
  • prepare()メソッドで再生準備をする

※停止後はprepare()メソッドを呼び出さないと以下のエラーが発生する

06-15 16:08:53.902: ERROR/MediaPlayer(470): Attempt to perform seekTo in wrong state: mPlayer=0x18b5b8, mCurrentState=64
06-15 16:08:53.902: ERROR/MediaPlayer(470): error (-38, 0)
06-15 16:08:53.902: ERROR/MediaPlayer(470): start called in state 0
06-15 16:08:53.902: ERROR/MediaPlayer(470): error (-38, 0)
06-15 16:08:53.902: ERROR/MediaPlayer(470): Error (-38,0)
06-15 16:08:53.902: ERROR/MediaPlayer(470): Error (-38,0)
public boolean onKeyDown(int keyCode, KeyEvent event) {
	MediaPlayer mp;
	switch(keyCode){
	case KeyEvent.KEYCODE_DPAD_CENTER:
		mp = this.sample;
		if(mp.isPlaying()){
			mp.stop();
			try {
				mp.prepare();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return true;
		
	case KeyEvent.KEYCODE_DPAD_DOWN:
		mp = this.sample;
		break;

	default :
		return super.onKeyDown(keyCode, event);

	}
	mp.seekTo(0);
	mp.start();
	return true;
	
}

全体ソース

package sound.sample;

import java.io.IOException;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;

public class SoundSample extends Activity {
	private MediaPlayer sample;
	private MediaPlayer chord;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        this.sample = MediaPlayer.create(this, R.raw.sample);
        this.chord = MediaPlayer.create(this, R.raw.chord);
        
    }
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		MediaPlayer mp;
		switch(keyCode){
		case KeyEvent.KEYCODE_DPAD_CENTER:
			mp = this.sample;
			if(mp.isPlaying()){
				mp.stop();
				try {
					mp.prepare();
				} catch (IllegalStateException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return true;
			
		case KeyEvent.KEYCODE_DPAD_DOWN:
			mp = this.sample;
			break;

		case KeyEvent.KEYCODE_DPAD_UP:
			mp = this.chord;
			break;

		default :
			return super.onKeyDown(keyCode, event);

		}
		mp.seekTo(0);
		mp.start();
		return true;
		
	}
}