public class AudioPlayer extends Activity {
private MediaPlayer mp;
// MediaPlayer 객체입니다.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText audioPath = (EditText)findViewById(R.id.srcEdt);
final CheckBox loopControl = (CheckBox)findViewById(R.id.setLoop);
final Button PlayPause = (Button)findViewById(R.id.PlayPause);
final Button Stop = (Button)findViewById(R.id.Stop);
final Button Load = (Button)findViewById(R.id.load);
// 파일 불러오기 버튼에 대한 리스너
Load.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if(!loadAudio(audioPath.getText().toString())){
// 오디오 파일을 불러옵니다.
Toast
// 오디오 파일 불러오기에 실패한 경우
.makeText(getApplicationContext(), "파일 불러오기에 실패했습니다.", Toast.LENGTH_LONG)
.show();
return;
}
audioPath.setEnabled(false);
// 파일 Path 입력란을 비활성화합니다.
PlayPause.setEnabled(true);
Stop.setEnabled(true);
loopControl.setEnabled(true);
Load.setEnabled(false);
좀 소스가 길어보이죠? 하지만 별로 어려울 건 없습니다.
길어진 건 제가 급하게 짜느라 효율성 이런걸 고려하지 않아서 그래요~~
import android.media.MediaPlayer;
일단, MediaPlayer 객체를 사용하려면 위와 같이 import 를 해주셔야 합니다.
저 객체에 멀티미디어 파일들을 불러오게 되는 것이죠~
미디어플레이어 객체(오디오)의 사용 단계는 다음과 같습니다.
1. 객체 생성
2. setDataSource()를 이용하여 파일을 불러옴 (다른 작업을 하기 전에 이 과정이 꼭 필요합니다! 안하면 에러..)
3. prepare()메소드를 이용하여 사용할 준비를 함
4. start() 메소드로 재생 시작, 이후 미디어 플레이어의 각종 메소드로 재생 컨트롤
5. 재생이 끝나면 미디어플레이어 객체를 소멸시킴 (Garbage collection)
객체를 생성하는 과정 및 setDataSource()를 통해 재생 준비를 하는 과정을 보겠습니다.
private boolean loadAudio(String path){
// 오디오 파일을 로드합니다.
mp = new MediaPlayer();
// MediaPlayer 객체를 생성합니다.
try{
mp.setDataSource(path);
mp.prepare();
// 파일을 준비합니다.
return true;
}catch(Exception e){
// 오디오 파일 로드에 실패하면
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
return false;
// false를 반환합니다.
}
}
위와 같이 path를 인자로 받아 오디오 파일을 불러오는 과정을 볼 수 있습니다. 파일의 path에 관한 설명은 이전 포스트(2009/04/07 - [안드로이드 이야기/이거, 알고있니?] - 안드로이드에서 재생할 수 있는 멀티미디어 파일 형식들 & 파일 사용법)을 참고하세요~
path 인자를 통해 받아온 것을 토대로 setDataSource()메소드에서 객체에 불러올 파일을 지정해주게 됩니다. 이 때, 에러가 발생하게 되면 적절히 예외 처리를 해 주시면 됩니다. 저는 에러 메시지를 Toast를 통해 사용자에게 보여주도록 하였습니다.
// 파일 불러오기 버튼에 대한 리스너
Load.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if(!loadAudio(audioPath.getText().toString())){
// 오디오 파일을 불러옵니다.
Toast
// 오디오 파일 불러오기에 실패한 경우
.makeText(getApplicationContext(), "파일 불러오기에 실패했습니다.", Toast.LENGTH_LONG)
.show();
return;
}
audioPath.setEnabled(false);
// 파일 Path 입력란을 비활성화합니다.
PlayPause.setEnabled(true);
Stop.setEnabled(true);
loopControl.setEnabled(true);
Load.setEnabled(false);
파일 불러오기 버튼을 누르면, 위에서 봤던 loadAudio()메소드를 호출하고, 그 결과에 따라서 에러 메시지를 표시할 것인지, 파일 재생 준비를 하는지 결정하게 됩니다.
그럼, 다음으로 재생하는 과정을 보도록 하죠.
// 재생/일시정지 버튼에 대한 리스너
PlayPause.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if(PlayPauseAudio()==0){
// 재생시
PlayPause.setText("일시정지");
// 버튼의 캡션을 일시정지로 변경합니다.
}else{
// 일시정지시
PlayPause.setText("재생");
// 버튼의 캡션을 재생으로 변경합니다.
}
}
});
저는 이 어플리케이션에서 재생 버튼을 누르면 일시정지 기능도 수행할 수 있게끔 구현하여서 버튼을 누를 때마다 상태에 따라서 레이블이 바뀌도록 하였습니다. 실질적인 재생 컨트롤에 대한 소스는 다음과 같습니다.
private int PlayPauseAudio(){
if(!mp.isPlaying()){
// 재생중이 아니라면
mp.start();
// 파일을 재생합니다.
Toast.makeText(getApplicationContext(), "재생", Toast.LENGTH_SHORT).show();
return 0;
재생/ 일시정지 여부는 MediaPlayer객체의 isPlaying() 메소드를 통해 구현하였습니다. 재생중일경우 isPlaying() 메소드는 true를, 아닐 경우 false를 반환하게 됩니다.
정지 버튼을 누르면, 정지를 수행하고 어플리케이션의 상태를 초기상태로 되될립니다.
// 정지버튼에 대한 리스너
Stop.setOnClickListener(new OnClickListener(){
// 정지버튼을 누르면
public void onClick(View v){
mp.stop();
// 정지합니다.
// 정지가 되면, Load버튼을 눌러 파일을 prepare 해야 하므로, 설정값들을 초기화합니다.
audioPath.setEnabled(true);
// 비활성화 되었던 입력란을 활성화합니다.
PlayPause.setText("재생");
loopControl.setChecked(false);
PlayPause.setEnabled(false);
Stop.setEnabled(false);
loopControl.setEnabled(false);
Load.setEnabled(true);
}
});
마지막으로, 액티비티가 종료될 때 미디어플레이어 객체를 반환하게 됩니다.
public void onDestroy(){
// 액티비티가 종료될 때
super.onDestroy();
if(mp != null)
mp.release();
// MediaPlayer 객체를 Release합니다.
mp = null;
}