Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีเล่นไฟล์เสียงจาก Assets Folder ใน Android

บทความนี้สาธิตวิธีเล่นไฟล์เสียง (Audio) ที่เก็บไว้ในโฟลเดอร์ assets โดยใช้ MediaPlayer และ AssetFileDescriptor

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project

ขั้นตอนที่ 2: สร้าง Assets Folder และวางไฟล์เสียง

  1. คลิกขวาที่โมดูล app → New → Folder → Assets Folder
  2. จะได้โฟลเดอร์ src/main/assets/
  3. คัดลอกไฟล์เสียง (เช่น 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)