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

Phát file âm thanh từ thư mục assets trong Android

Phát file âm thanh từ thư mục assets trong Android

Hướng dẫn này minh họa cách phát file audio (mp3, wav, ogg) đặt trong thư mục assets bằng MediaPlayer.

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 (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btnPlayAudio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Play Audio"
        android:textStyle="italic"
        android:layout_centerInParent="true" />
</RelativeLayout>

Bước 3: Tạo thư mục assets và thêm file audio

  1. Chuột phải vào module app → New → Folder → Assets Folder
  2. Chọn Target Source Set: main → Finish
  3. Copy file audio (ví dụ: audio.mp3) vào thư mục src/main/assets/

Bước 4: Code MainActivity.java

import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = findViewById(R.id.btnPlayAudio);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mediaPlayer = new MediaPlayer();
                try {
                    // Mở file từ assets
                    AssetFileDescriptor afd = getAssets().openFd("audio.mp3");
                    mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                    
                    // Giải phóng khi phát xong
                    mediaPlayer.setOnCompletionListener(mp -> {
                        mp.release();
                    });
                    
                    Toast.makeText(MainActivity.this, "Playing audio from Asset directory", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "Error playing audio: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Giải phóng MediaPlayer nếu đang phát khi destroy activity
    }
}

Bước 5: 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

Kết nối thiết bị, chạy app. Nhấn nút "Play Audio" để phát file audio.mp3 từ thư mục assets.

Lưu ý quan trọng:
  • File trong assets/ không được nén, giữ nguyên định dạng
  • Sử dụng AssetFileDescriptor với getFileDescriptor(), getStartOffset(), getLength() cho chính xác
  • Luôn gọi mediaPlayer.release() trong onCompletionListener hoặc onDestroy() để tránh rò rỉ bộ nhớ
  • Hỗ trợ định dạng: MP3, WAV, OGG, AAC, FLAC (tùy thiết bị)

Cải tiến: MediaPlayer singleton để phát nhiều lần

private MediaPlayer mediaPlayer;

private void playAudio() {
    if (mediaPlayer != null) {
        mediaPlayer.release();
    }
    mediaPlayer = new MediaPlayer();
    try {
        AssetFileDescriptor afd = getAssets().openFd("audio.mp3");
        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        mediaPlayer.prepareAsync(); // Chuẩn bị bất đồng bộ
        mediaPlayer.setOnPreparedListener(mp -> mp.start());
    } catch (IOException e) {
        e.printStackTrace();
    }
}