앱 만들기/안드로이드 study

안드로이드 사운드를 재생하자. Media Player 다루기

나도처음이야 2020. 4. 25.

안드로이드 앱을 개발할 때 사운드를 재생하는 방법을 이야기해보자.

앱을 만들 때 소리가 없으면 심심하지 않은가?

사운드는 크게 2가지, 효과음과 BGM 등으로 나뉠 수 있다.

안드로이드에서는 짧은 효과음의 경우 SoundPool이라는 클래스를 활용한다.

그리고 BGM 등 긴 사운드를 재생하기 위해서는 Media Player 클래스를 다룬다.

바로 오늘의 주제이다. 구현해보자.

 

1. 화면 구성하기(XML)

 

필자는 위와 같이 화면을 구성하였다.

재생 버튼에서는 Start/Stop 사운드 함수 테스트 용이고,

일시 정지 버튼은 Start/Pause 함수를 테스트 하기 위함이다.

<?xml version="1.0" encoding="utf-8"?>

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity">

 

    <Button

        android:id="@+id/button"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="재생"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintEnd_toEndOf="parent"

        app:layout_constraintHorizontal_bias="0.26"

        app:layout_constraintStart_toStartOf="parent"

        app:layout_constraintTop_toTopOf="parent"

        app:layout_constraintVertical_bias="0.499" />

 

    <Button

        android:id="@+id/button2"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="일시정지"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintEnd_toEndOf="parent"

        app:layout_constraintStart_toEndOf="@+id/button"

        app:layout_constraintTop_toTopOf="parent" />

 

</androidx.constraintlayout.widget.ConstraintLayout>

2. Raw 리소스 폴더를 생성하자.

    -안드로이드 에서는 사운드 리소스 파일을 Raw 폴더에서 불러온다

    -참고로, 안드로이드에서 지원하는 사운드 포맷은 mp3,aac,wma,amr,ogg,midi,wav 이다.

Project 탭 -> res 폴더 -> Directory 선택 후 Raw 폴더를 만들자.

 

생성된 Raw 폴더안에 테스트 할 사운드 파일을 넣자.

 

3. 소스 작업하기

public class MainActivity extends AppCompatActivity {

    MediaPlayer
mediaPlayer;
   
Button  button, button2 ;
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
       
setContentView(R.layout.activity_main);
  
       
button = (Button)findViewById(R.id.button);
       
button2 = (Button)findViewById(R.id.button2);
       
//Star() + Stop() 예제
       
button.setOnClickListener(new View.OnClickListener(){
           
@Override
           
public void onClick(View view) {
               
// 플레이 중이라면
               
if(mediaPlayer != null &&  mediaPlayer.isPlaying())
                {
                   
mediaPlayer.stop();
                    
mediaPlayer.release()
;
                   
mediaPlayer = null;

                    // reset() 함수만으로도 동작한다.
                   
//mediaPlayer.reset();
                   
button.setText("재생 하기");
               
}
               
else // 미디어 리소스를 생성하고 플레이 시킨다.
               
{
                    
mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.car);
                   
mediaPlayer.start();

                    // 반복재생하기
                   
mediaPlayer.setLooping(true);
                   
button.setText("종료 하기");
               
}
            }
        })
;
       
//Star() + Pause() 예제
       
button2.setOnClickListener(new View.OnClickListener(){
           
@Override
           
public void onClick(View view) {
               
if(mediaPlayer != null  ) {
                   
//플레이 중이면 일시정지
                   
if (mediaPlayer.isPlaying()) {
                       
mediaPlayer.pause();
                       
button2.setText("재생 하기");
                   
} else // 미디어 리소스를 생성하고 플레이 시킨다.
                   
{
                       
mediaPlayer.start();
                        
mediaPlayer.setLooping(true)
;
                       
button2.setText("일시 정지 하기");
                   
}
                }
            }

        })
;
   
}

   
@Override
   
protected void onDestroy() {
       
super.onDestroy();
        // mediaPlayer 리소스를 해제 해준다.
        if
(mediaPlayer != null){
           
mediaPlayer.release();
           
mediaPlayer =
null;
       
}
    }
}

 

각각의 버튼에 stop 과 pause 에 대한 예제를 구현 해보았다.

사운드 재생 중 완전 종료 및 일시 정지 및 재생등이 잘 동작된다.  위는 예제이기에 각자의 코드에 맞게 응용이 필요하다.  주요 한 점은, MediaPlayer 상태 다이어그램을 보고 코드를 작성하는 것이다.

즉, Stop 이 되었다면 바로 Start 를 할수 없고 리소스를 처음부터 재 생성하는 과정이 필요하다.

Pause 는 재생 중 멈추는 기능이기에 다시 Start 가 가능하다.

 

그리고, 앱을 종료하거나 MedaPlayer 를 더 이상 사용치 않을때는

항상 release 를 통해 자원을 반납 해주어야 한다.

 

 

 

 

MediaPlayer 개요  |  Android 개발자  |  Android Developers

Android 멀티미디어 프레임워크는 다양한 일반 미디어 유형의 재생을 지원하므로 오디오, 동영상, 이미지를 애플리케이션에 쉽게 통합할 수 있습니다. 애플리케이션 리소스(원시 리소스)에 저장된 미디어 파일, 파일 시스템의 독립형 파일 또는 네트워크 연결을 통해 들어오는 데이터 스트림에서 모두 MediaPlayer API를 사용하여 오디오 또는 동영상을 재생할 수 있습니다. 이 문서에서는 우수한 성능과 쾌적한 사용자 환경을 얻기 위해 사용자 및 시스템과 상

developer.android.com

커피 한잔과 함께

행복한 하루 되시길 바랍니다. 감사합니다.

반응형

댓글