[Android] MediaPlayer Android 2011. 12. 13. 17:44

안드로이드에서 음원을 재생하는 클래스이다.

먼저 android.Media 를 import 시키고 res 아래에 raw 를 생성한 뒤 그곳에 음원 파일을 import 한다.

단 안드로이드에서는 대문자를 지원하지 않음으로 전부 소문자 파일이어야 한다.

그렇게 준비하고 다음과 같은 코드를 실행 하면 음원이 재생 되는 것을 확인 할 수 있다.

(ain.xml 파일에는 버튼 4개를 준비한다.)

package imageview.test;

import android.app.Activity;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.media.*;
import android.content.*;

public class ImageViewActivity extends Activity {
 Beeper beeper1;
 Beeper beeper2;
    /** Called when the activity is first created. */
 
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        beeper1 = new Beeper(this,R.raw.aid);
        beeper2 = new Beeper(this,R.raw.kalimba);
       
        findViewById(R.id.btn1).setOnClickListener(listener);
        findViewById(R.id.btn2).setOnClickListener(listener);
        findViewById(R.id.btn3).setOnClickListener(listener);
        findViewById(R.id.btn4).setOnClickListener(listener);
    }
 
 Button.OnClickListener listener = new Button.OnClickListener(){
  public void onClick(View v)
  {
   MediaPlayer player;
   switch(v.getId())
   {
    case R.id.btn1 :
     player = MediaPlayer.create(ImageViewActivity.this, R.raw.aid);
     player.start();
     break;
    case R.id.btn2 :
     player = MediaPlayer.create(ImageViewActivity.this, R.raw.kalimba);
     break;
    case R.id.btn3 :
     beeper1.play();
     break;
    case R.id.btn4 :
     beeper2.play();
     break;
   }
  }
 };
 
 class Beeper
 {
  MediaPlayer player;
  Beeper(Context context, int id)
  {
   player = MediaPlayer.create(context, id);
  }
  
  void play()
  {
   player.seekTo(0);
   player.start();
  }
 }
}

위 코드에서 1번과 2번의 경우 무작위로 누를 경우 프로그램의 부하가 생기지만 3번과 4번의 경우는 거의 생기지 않는다. 반응과 안정성에서는 훨씬 좋다.

다음은 SoundPool을 이용한 방법이다.

SoundPool pool;
 int flag=0;
    /** Called when the activity is first created. */
 
 @Override   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        pool = new SoundPool(1,AudioManager.STREAM_MUSIC,0);
        flag = pool.load(this,R.raw.aid,1);
        findViewById(R.id.btn1).setOnClickListener(listener);
        findViewById(R.id.btn2).setOnClickListener(listener);
        findViewById(R.id.btn3).setOnClickListener(listener);
        findViewById(R.id.btn4).setOnClickListener(listener);
    }
 
 Button.OnClickListener listener = new Button.OnClickListener(){
  public void onClick(View v)
  {
   switch(v.getId())
   {
    case R.id.btn1 :
     pool.play(flag, 1, 1, 0, 0, 1);     
    case R.id.btn2 :
     pool.play(flag, 0.5f, 0.5f, 0, 0, 1);
    case R.id.btn3 :
     pool.play(flag, 1, 1, 0, 2, 1);
    case R.id.btn4 :
     pool.play(flag, 1, 1, 0, 0, 0.5f);
   }
  }
 };

얼핏봐도 처음 코드 보단 단순하다. SoundPool의 생성자의 첫번재 인수는 스트림갯수이고, 그 다음은 타입, 그 다음은 품질에 해당하는 것이다.

play 메서드를 보면 재생할 사운드 지정하고, 그 다음이 좌측 볼륨, 우측 볼륨, 재생 우선 순위, 반복 횟수, 재생 속도를 나타낸다)

재생 반복 횟수에서 0은 한번만 재생하는 것이다.