안드로이드 MP3 플레이어 개발해보기

프로토타입 형태의 안드로이드 mp3 플레이어를 순수 안드로이드 API만을 이용해 만들어봤습니다.

기능은 Play 와 Stop 두가지만 구현되있고, UI 는 간단히 이 두 함수를 호출하는 버튼으로만 구성되있습니다. 안드로이드 API 에서 mp3 플레이 관련 기능을 한번 느껴보고 싶어서 만들었는데, 제한적인 기능만을 구현하긴 했지만, 그렇게 나쁘지 않다는 느낌.

안드로이드의 ADK 를 이용해 mp3 플레이어를 만들기 위해서 가장 중요한 라이브러리는 android.media.MediaPlay 입니다. 정보는 현재  이곳 http://developer.android.com/reference/android/media/MediaPlayer.html 을 방문하면 얻을 수 있습니다.

개발하면서 삽질이 좀 있었는데, – -;; 안드로이드 미디어 플레이어 구현의 핵심은 위 사이트에 나와있는 그림 한장을 온전히 이해하는 것입니다. 바로 아래에 있는 State Diagram 인데요.

Media Player State Diagram

Media Player State Diagram

특정 메소드를 호출했을 때 미디어 플레이어의 상태가 어떤 상태로 이전되는지를 이해하는 것이 핵심입니다. 이를 가볍게 생각하다간 저처럼 삽질 ㅎㅎ

또한 현재로서는 MediaPlayer 라이브러리에 getState() 같은 메소드가 구현되있지 않기 때문에, 현재 상태를 알아내는게 쉽지가 않습니다. 그래서 현재 구현에서는 Stop시 stop() 메소드를 호출하고 바로 이어서 release(), 그리고 mediaplayer 인스턴스를 null 로 만들어줬습니다.

release() 메소드의 API 를 읽어보면 중요한 포인트가 나와있는데, stop 이나 pause 를 부르고 나서 이 메소드를 부르는게 좋다고 말하고 있습니다.

public void release ()

Releases resources associated with this MediaPlayer object. It is considered good practice to call this method when you’re done using the MediaPlayer. In particular, whenever an Activity of an application is paused (its onPause() method is called), or stopped (its onStop() method is called), this method should be invoked to release the MediaPlayer object, unless the application has a special need to keep the object around. In addition to unnecessary resources (such as memory and instances of codecs) being held, failure to call this method immediately if a MediaPlayer object is no longer needed may also lead to continuous battery consumption for mobile devices, and playback failure for other applications if no multiple instances of the same codec are supported on a device. Even if multiple instances of the same codec are supported, some performance degradation may be expected when unnecessary multiple instances are used at the same time.

역시 항상 진리는 API 속에 있는데, 귀찮다고 건너뛰면 더 긴 시간을 보내게 됨을 다시한번 느꼈다는.

아래 코드입니다.

package com.audroid.music;

import android.app.Activity;
import android.content.Context;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class HelloMusicActivity extends Activity implements OnClickListener{
 /** Called when the activity is first created. */
 MediaPlayer m;
 Context c;

 @Override
 public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     Button btnPlay = (Button)findViewById(R.id.buttonPlay);
     Button btnStop = (Button)findViewById(R.id.buttonStop);

     //Register button click listener
     btnPlay.setOnClickListener(this);
     btnStop.setOnClickListener(this);
     }

     //Register button click event
     public void onClick(View v){
         int id = v.getId();
         if(id == R.id.buttonPlay){
             play();
         }else if(id == R.id.buttonStop){
         stop();
         }else{
         //do nothing
         }
     }

     //Play music
     public void play(){
         c = getApplicationContext();
         try {
             stop();
             m = MediaPlayer.create(c, R.raw.a);
             m.setLooping(true);
             m.start();
         }catch (IllegalStateException e) {
             e.printStackTrace();
         }
     }

//Stop music play
     public void stop()
     {
         try {
             if(m != null)
             {
                 m.stop();
                 m.release();
                 m = null;
             }
         } catch (IllegalStateException e) {
             e.printStackTrace();
         }
     }
}

아래 코드는 UI 코드인 main.xml 입니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:id="@+id/buttonPlay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/strplay" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/buttonStop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/strStop" />
</LinearLayout>

일단 현재 구성에서는 로컬 경로에 있는 mp3 파일(a.mp3)을 불러와서 실행하게 되있으므로, 이클립스 프로젝트 구성시 res/raw 폴더아래 테스트용 mp3인 a.mp3 파일을 넣어두어야 합니다.

eclipse package hierarchy

eclipse package hierarchy

 
실행시는 아래 그림처럼 단촐한 두개의 버튼을 가진 UI 입니다.
Android mp3 player

Android mp3 player

Advertisements

About sydlife

Lazy programmer, Dad and Husband.
%d bloggers like this: