บทความนี้สาธิตวิธีเล่นไฟล์เสียง (Audio) ที่เก็บไว้ในโฟลเดอร์ assets โดยใช้ MediaPlayer และ AssetFileDescriptor
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project
ขั้นตอนที่ 2: สร้าง Assets Folder และวางไฟล์เสียง
- คลิกขวาที่โมดูล
app→ New → Folder → Assets Folder - จะได้โฟลเดอร์
src/main/assets/ - คัดลอกไฟล์เสียง (เช่น
audio.mp3) วางไว้ในโฟลเดอร์นี้
ขั้นตอนที่ 3: Layout (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:layout_centerInParent="true"
android:text="Play Audio"
android:textStyle="italic" />
</RelativeLayout>
ขั้นตอนที่ 4: 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 btnPlayAudio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPlayAudio = findViewById(R.id.btnPlayAudio);
btnPlayAudio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playAudioFromAssets();
}
});
}
private void playAudioFromAssets() {
MediaPlayer mediaPlayer = new MediaPlayer();
try {
// เปิดไฟล์จาก Assets
AssetFileDescriptor afd = getAssets().openFd("audio.mp3");
// ตั้งค่า Data Source
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
// เตรียมและเล่น
mediaPlayer.prepare();
mediaPlayer.start();
Toast.makeText(this, "Playing audio from Assets", Toast.LENGTH_SHORT).show();
// ปล่อยทรัพยากรเมื่อเล่นจบ
mediaPlayer.setOnCompletionListener(mp -> {
mp.release();
});
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Error playing audio: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// ป้องกัน Memory leak
}
}
⚠️ ข้อควรระวังและ Best Practices
- AssetFileDescriptor - ใช้แทน InputStream เพื่อรองรับการ seek และได้ขนาดไฟล์
afd.getStartOffset()และafd.getLength()- สำคัญสำหรับไฟล์ใน APK ที่บีบอัด- mediaPlayer.release() - ต้องเรียกเสมอเมื่อไม่ใช้แล้ว (ใน onCompletionListener)
- ไฟล์ใน assets ไม่ถูกบีบอัดซ้ำ (uncompressed) หากนามสกุลเป็น .mp3, .wav, .ogg ฯลฯ
รูปแบบไฟล์ที่รองรับ
Android รองรับ: MP3, AAC, AMR, FLAC, MIDI, OGG, WAV (ดูรายละเอียดใน Media Formats)
ทางเลือกอื่น: Raw Resources
หากไฟล์เล็กและไม่ต้องเปลี่ยนแปลง ควรวางใน res/raw/ แทน (เข้าถึงง่ายกว่า):
MediaPlayer.create(this, R.raw.audio); // ไม่ต้องใช้ AssetFileDescriptor
สำหรับ Audio ยาว/Streaming: ใช้ ExoPlayer
MediaPlayer เหมาะสำหรับไฟล์สั้น (SFX, เสียงสั้น) สำหรับเพลง/พอดแคสต์ ควรใช้ ExoPlayer (Media3)