畫面再精美,沒有音效與背景音樂的遊戲總覺得缺了靈魂。J2ME 通過 Mobile Media API (MMAPI) 提供音頻支持,MIDP 2.0 更定義了輕量級的 javax.microedition.media 包,專為受限設備設計。本文詳細講解核心架構、支持格式檢測、播放流程與完整代碼範例。
VolumeControl 音量、ToneControl 樂音序列)。不同手機支持格式差異極大,發布前務必動態檢測:
String[] types = Manager.getSupportedContentTypes(null);
for (String type : types) {
// 顯示支持的 MIME 類型
if ("audio/x-tone-seq".equals(type)) {
// 支持 Tone 序列,可播放簡單旋律
Manager.playTone(ToneControl.C4, 2000, 100);
}
}
常見 MIDP 2.0 手機支持的 MIME 類型:
| MIME 類型 | 說明 |
|---|---|
| audio/x-tone-seq | Tone 序列(單音/旋律) |
| audio/x-wav | WAV 波形音頻 |
| audio/midi | MIDI 音樂 |
| audio/mpeg | MP3 音頻 |
Manager.createPlayer() 獲取 Player 實例player.realize() → player.prefetch() 準備資源player.start() 開始播放byte[] sequence = {
ToneControl.VERSION, 1,
ToneControl.TEMPO, 50, // 速度
ToneControl.SET_VOLUME, 100, // 音量
ToneControl.BLOCK_START, 0, // 定義塊 0
ToneControl.C4, 8, ToneControl.D4, 8, ToneControl.E4, 8, // 內容
ToneControl.BLOCK_END, 0,
ToneControl.PLAY_BLOCK, 0 // 播放塊 0
};
Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
p.realize();
ToneControl tc = (ToneControl) p.getControl("ToneControl");
tc.setSequence(sequence);
p.prefetch();
p.start();
InputStream is = getClass().getResourceAsStream("/bgm.mid");
Player player = Manager.createPlayer(is, "audio/midi");
player.realize();
player.prefetch();
// 音量控制(需在 realize/prefetch 後獲取)
VolumeControl vc = (VolumeControl) player.getControl("VolumeControl");
if (vc != null) vc.setLevel(50); // 0-100
player.start();
關鍵提醒:VolumeControl 必須在 realize() 或 prefetch() 之後獲取,否則部分手機會靜音或拋出異常。且並非所有格式都支持音量控制,務必做 null 判斷。
player.stop() 釋放資源,恢復時 prefetch() + start()。MediaException 與 IOException,優雅降級(如無聲運行)。