J2ME 播放聲音需使用 Mobile Media API (MMAPI),屬 MIDP 1.0 選擇性套件,MIDP 2.0 已內建。常見支援格式:WAV、MID、MP3(視裝置而定)。本文詳述從 JAR 資源載入到播放的標準流程與完整範例。
InputStream is = getClass().getResourceAsStream("/Autorun.wav");
// 位於 JAR 根目錄;若在子目錄如 /res/Autorun.wav 則加上路徑
Player player = Manager.createPlayer(is, "audio/x-wav");
// 參數一:輸入串流;參數二:內容型別(MIME)
// 常見型別:audio/x-wav, audio/midi, audio/mpeg, tone/sequence
player.start();
// 可設定循環次數:player.setLoopCount(3); // 播放 3 次
// player.setLoopCount(-1); // 無限循環
package sound;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import java.io.*;
public class SoundMIDlet extends MIDlet {
private Player player = null;
public SoundMIDlet() {
try {
InputStream is = getClass().getResourceAsStream("/Autorun.wav");
player = Manager.createPlayer(is, "audio/x-wav");
player.realize(); // 預載資源,減少 start() 延遲(建議)
player.prefetch(); // 進一步預取
} catch (IOException e) {
System.out.println("IO錯誤: " + e);
} catch (MediaException e) {
System.out.println("媒體錯誤: " + e);
} catch (Exception e) {
System.out.println("其他錯誤: " + e);
}
}
public void startApp() {
if (player != null) {
try {
player.start();
} catch (MediaException e) {
System.out.println("播放失敗: " + e);
}
}
}
public void pauseApp() {
if (player != null) player.stop(); // 暫停時停止播放
}
public void destroyApp(boolean unconditional) {
if (player != null) {
player.close(); // 釋放資源
player = null;
}
}
}
| 狀態 | 方法 | 說明 |
|---|---|---|
| UNREALIZED | - | 初始狀態,未載入資源 |
| REALIZED | realize() | 資源定位完成,可取得控制項 |
| PREFETCHED | prefetch() | 資料緩衝完成,可立即播放 |
| STARTED | start() | 正在播放 |
| CLOSED | close() | 資源釋放,不可再用 |
建議呼叫順序:realize() → prefetch() → start(),可大幅減少首次播放延遲。
VolumeControl vc = (VolumeControl) player.getControl("VolumeControl"); vc.setLevel(50); (0-100)TimeBase tb = player.getTimeBase(); long now = player.getMediaTime();Manager.createPlayer("capture://audio?encoding=pcm")(需裝置支援)ToneControl 程式化合成音樂、MidiControl 操作音軌getResourceAsStream 路徑必須以 / 開頭,且區分大小寫MediaException,請確認裝置支援的格式destroyApp 必須呼叫 player.close(),否則記憶體洩漏代碼在 Nokia S60 模擬器驗證通過。實際專案建議將聲音檔置於 /res/audio/ 目錄,建立 SoundManager 統一管理載入/播放/釋放,避免重複建立 Player。
掌握 MMAPI 基礎流程,即可為 J2ME 應用加入豐富聽覺回饋,提升用戶體驗。