Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Sử dụng MediaPlayer tạo trình phát nhạc cơ bản trong Android

Giới thiệu

Ví dụ này minh họa cách sử dụng lớp MediaPlayer để tạo một trình phát âm thanh (audio player) cơ bản với các chức năng: play, pause, forward, backward, seek bar.

Các bước thực hiện

Bước 1: Tạo dự án mới

Mở Android Studio, chọn File → New Project và điền thông tin cần thiết.

Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)

<?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="Đang phát: "
        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"
        android:contentDescription="Lùi 5 giây"/>

    <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"
        android:contentDescription="Phát"/>

    <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"
        android:contentDescription="Tạm dừng"/>

    <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:src="@drawable/ic_forward"
        android:contentDescription="Tiến 5 giây"/>

    <TextView
        android:id="@+id/txtStartTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/seekBar"
        android:text="0:00" />

    <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:00" />

</RelativeLayout>

Bước 3: Viết code MainActivity.java

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;
    private static final int FORWARD_TIME = 5000, BACKWARD_TIME = 5000;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initViews();
        setupMediaPlayer();
        setupListeners();
    }

    private void initViews() {
        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);
        songProgress = findViewById(R.id.seekBar);
        
        songName.setText("Bohemian Rhapsody");
        songProgress.setClickable(false);
        pauseBtn.setEnabled(false);
    }

    private void setupMediaPlayer() {
        // Đặt file bohemian_rhapsody.mp3 vào res/raw/
        mediaPlayer = MediaPlayer.create(this, R.raw.bohemian_rhapsody);
    }

    private void setupListeners() {
        playBtn.setOnClickListener(v -> playAudio());
        pauseBtn.setOnClickListener(v -> pauseAudio());
        forwardBtn.setOnClickListener(v -> seekForward());
        backwardBtn.setOnClickListener(v -> seekBackward());
    }

    private void playAudio() {
        mediaPlayer.start();
        endTime = mediaPlayer.getDuration();
        playTime = mediaPlayer.getCurrentPosition();

        if (onTime == 0) {
            songProgress.setMax(endTime);
            onTime = 1;
        }

        updateTimeDisplay();
        handler.postDelayed(updateSongTime, 100);

        pauseBtn.setEnabled(true);
        playBtn.setEnabled(false);
        Toast.makeText(this, "Đang phát nhạc", Toast.LENGTH_SHORT).show();
    }

    private void pauseAudio() {
        mediaPlayer.pause();
        pauseBtn.setEnabled(false);
        playBtn.setEnabled(true);
        Toast.makeText(this, "Tạm dừng", Toast.LENGTH_SHORT).show();
    }

    private void seekForward() {
        if (playTime + FORWARD_TIME <= endTime) {
            playTime += FORWARD_TIME;
            mediaPlayer.seekTo(playTime);
        } else {
            Toast.makeText(this, "Không thể tua tiến thêm", Toast.LENGTH_SHORT).show();
        }
        playBtn.setEnabled(true);
    }

    private void seekBackward() {
        if (playTime - BACKWARD_TIME > 0) {
            playTime -= BACKWARD_TIME;
            mediaPlayer.seekTo(playTime);
        } else {
            Toast.makeText(this, "Không thể tua lùi thêm", Toast.LENGTH_SHORT).show();
        }
        playBtn.setEnabled(true);
    }

    private void updateTimeDisplay() {
        songTime.setText(formatTime(endTime));
        startTime.setText(formatTime(playTime));
        songProgress.setProgress(playTime);
    }

    private String formatTime(long millis) {
        return String.format("%d:%02d",
            TimeUnit.MILLISECONDS.toMinutes(millis),
            TimeUnit.MILLISECONDS.toSeconds(millis) % 60);
    }

    private Runnable updateSongTime = new Runnable() {
        @Override
        public void run() {
            playTime = mediaPlayer.getCurrentPosition();
            startTime.setText(formatTime(playTime));
            songProgress.setProgress(playTime);
            handler.postDelayed(this, 100);
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null) {
            mediaPlayer.release();
            mediaPlayer = null;
        }
        handler.removeCallbacks(updateSongTime);
    }
}

Bước 4: Cấu hình 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>

Chạy ứng dụng

Đặt file âm thanh bohemian_rhapsody.mp3 vào thư mục res/raw/. Chuẩn bị 4 icon: ic_back, ic_play, ic_pause, ic_forward trong drawable. Kết nối thiết bị, nhấn Run.

Sử dụng MediaPlayer tạo trình phát nhạc cơ bản trong Android

Sử dụng MediaPlayer tạo trình phát nhạc cơ bản trong Android

Sử dụng MediaPlayer tạo trình phát nhạc cơ bản trong Android

Sử dụng MediaPlayer tạo trình phát nhạc cơ bản trong Android