多條語音消息同時到達,需按順序播放:前一條播放完成後自動播放下一條。
public class VoicePlayer {
private final Queue playQueue = new ConcurrentLinkedQueue<>();
private final MediaPlayer mediaPlayer = new MediaPlayer();
private boolean isPlaying = false;
private final Handler handler = new Handler(Looper.getMainLooper());
public void enqueue(String text) {
playQueue.offer(text);
if (!isPlaying) playNext();
}
private void playNext() {
String text = playQueue.poll();
if (text == null) { isPlaying = false; return; }
isPlaying = true;
// TTS 合成或預錄音頻播放
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(generateAudioFile(text)); // 或 TTS speak
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(mp -> mp.start());
mediaPlayer.setOnCompletionListener(mp -> {
handler.post(this::playNext); // 切換到主線程循環
});
} catch (IOException e) {
handler.post(this::playNext); // 出錯跳過
}
}
}
OnCompletionListener 觸發下一條,天然順序保證onUtteranceCompleted 替代 MediaPlayer 回調語音播放隊列本質是「生產者-消費者」單消費者模型。MediaPlayer/TTS 異步回調驅動消費,代碼簡潔且順序嚴格保證。