Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android 앱에서 MediaPlayer 클래스로 기본 오디오 플레이어 구현하는 방법

이 예제에서는 안드로이드 앱에서 MediaPlayer 클래스를 사용하여 재생, 일시정지, 5초 앞뒤 이동 기능을 갖춘 기본 오디오 플레이어를 구현하는 방법을 단계별로 살펴봅니다.

1단계: 새 프로젝트 생성

Android Studio를 실행하고 File → New Project 메뉴로 이동한 뒤, 새 프로젝트를 만드는 데 필요한 모든 정보를 입력하여 프로젝트를 생성합니다.

2단계: 레이아웃 파일 작성

다음 코드를 res/layout/activity_main.xml에 추가합니다. 이 레이아웃에는 곡 제목 표시 영역, 재생·일시정지·앞뒤 이동 버튼, 그리고 재생 진행 상태를 보여주는 시크바(SeekBar)가 포함됩니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="10dp"
    android:paddingRight="10dp">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Now Playing: "
        android:layout_marginTop="30dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    <TextView
        android:id="@+id/txtSongName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView"
        android:layout_toEndOf="@+id/textView" />
    <ImageButton
        android:id="@+id/btnBackward"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="44dp"
        android:layout_marginLeft="20dp"
        android:src="@drawable/ic_back" />
    <ImageButton
        android:id="@+id/btnPlay"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/btnBackward"
        android:layout_marginLeft="20dp"
        android:layout_toRightOf="@+id/btnBackward"
        android:src="@drawable/ic_play" />
    <ImageButton
        android:id="@+id/btnPause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/btnPlay"
        android:layout_marginLeft="20dp"
        android:layout_toRightOf="@+id/btnPlay"
        android:src="@drawable/ic_pause" />
    <ImageButton
        android:id="@+id/btnForward"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/btnPause"
        android:layout_marginLeft="20dp"
        android:layout_toRightOf="@+id/btnPause"
        android:contentDescription="@+id/imageButton3"
        android:src="@drawable/ic_forward" />
    <TextView
        android:id="@+id/txtStartTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/seekBar"
        android:text="0 min, 0 sec" />
    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/btnBackward"
        android:layout_toLeftOf="@+id/txtSongTime"
        android:layout_toRightOf="@+id/txtStartTime" />
    <TextView
        android:id="@+id/txtSongTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/btnForward"
        android:layout_alignTop="@+id/seekBar"
        android:text="0 min, 0 sec " />
</RelativeLayout>

3단계: 메인 액티비티 코드 작성

다음 코드를 src/MainActivity.java에 추가합니다. 이 코드는 MediaPlayer 객체를 생성하고, 버튼 클릭 이벤트를 처리하며, Handler를 통해 현재 재생 시간을 100밀리초마다 갱신합니다.

import android.media.MediaPlayer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
    private ImageButton forwardBtn, backwardBtn, pauseBtn, playBtn;
    private MediaPlayer mediaPlayer;
    private TextView songName, startTime, songTime;
    private SeekBar songProgress;
    private static int onTime =0, playTime =0, endTime =0, forwardTime = 5000, backwardTime = 5000;
    private Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        backwardBtn = findViewById(R.id.btnBackward);
        forwardBtn = findViewById(R.id.btnForward);
        playBtn = findViewById(R.id.btnPlay);
        pauseBtn = findViewById(R.id.btnPause);
        songName = findViewById(R.id.txtSongName);
        startTime = findViewById(R.id.txtStartTime);
        songTime = findViewById(R.id.txtSongTime);
        songName.setText("Bohemian_Rhapsody");
        mediaPlayer = MediaPlayer.create(this, R.raw.bohemian_rhapsody);
        songProgress = findViewById(R.id.seekBar);
        songProgress.setClickable(false);
        pauseBtn.setEnabled(false);
        playBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Playing Audio", Toast.LENGTH_SHORT).show();
                mediaPlayer.start();
                endTime = mediaPlayer.getDuration();
                playTime = mediaPlayer.getCurrentPosition();
                if (onTime == 0) {
                    songProgress.setMax(endTime);
                    onTime = 1;
                }
                songTime.setText(String.format("%d min, %d sec",
                TimeUnit.MILLISECONDS.toMinutes(endTime),
                TimeUnit.MILLISECONDS.toSeconds(endTime) -
                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(endTime))));
                startTime.setText(String.format("%d min, %d sec",
                TimeUnit.MILLISECONDS.toMinutes(playTime),
                TimeUnit.MILLISECONDS.toSeconds(playTime) -
                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(playTime))));
                songProgress.setProgress(playTime);
                handler.postDelayed(UpdateSongTime, 100);
                pauseBtn.setEnabled(true);
                playBtn.setEnabled(false);
            }
        });
        pauseBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.pause();
                pauseBtn.setEnabled(false);
                playBtn.setEnabled(true);
                Toast.makeText(getApplicationContext(), "Pausing Audio", Toast.LENGTH_SHORT).show();
            }
        });
        forwardBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if ((playTime + forwardTime) <= endTime) {
                    playTime = playTime + forwardTime;
                    mediaPlayer.seekTo(playTime);
                } else {
                    Toast.makeText(getApplicationContext(), "Cannot jump forward 5 seconds", Toast.LENGTH_SHORT).show();
                }
                if (!playBtn.isEnabled()) {
                    playBtn.setEnabled(true);
                }
            }
        });
        backwardBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if ((playTime - backwardTime) > 0) {
                    playTime = playTime - backwardTime;
                    mediaPlayer.seekTo(playTime);
                } else {
                    Toast.makeText(getApplicationContext(), "Cannot jump backward 5 seconds", Toast.LENGTH_SHORT).show();
                }
                if (!playBtn.isEnabled()) {
                    playBtn.setEnabled(true);
                }
            }
        });
    }
    private Runnable UpdateSongTime = new Runnable() {
        @Override
        public void run() {
            playTime = mediaPlayer.getCurrentPosition();
            startTime.setText(String.format("%d min, %d sec",
            TimeUnit.MILLISECONDS.toMinutes(playTime),
            TimeUnit.MILLISECONDS.toSeconds(playTime) -
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(playTime))) );
            songProgress.setProgress(playTime);
            handler.postDelayed(this, 100);
        }
    };
}

4단계: 매니페스트 파일 확인

다음 코드를 androidManifest.xml에 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 스마트폰이 컴퓨터와 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run(실행) 아이콘을 클릭하세요. 실행 옵션 목록에서 자신의 모바일 기기를 선택하면, 아래와 같은 기본 화면이 기기에 표시됩니다.

Android 앱에서 MediaPlayer 클래스로 기본 오디오 플레이어 구현하는 방법

Android 앱에서 MediaPlayer 클래스로 기본 오디오 플레이어 구현하는 방법 

Android 앱에서 MediaPlayer 클래스로 기본 오디오 플레이어 구현하는 방법

Android 앱에서 MediaPlayer 클래스로 기본 오디오 플레이어 구현하는 방법