要實現(xiàn)您所描述的功能,我們需遵循以下步驟:
1.創(chuàng)建一個MediaPlayer實例并設置其完成監(jiān)聽器。
2.使用一個變量來存儲最新的播放請求。
3.當一個新的播放請求到達時,檢查當前是否有語音正在播報。如果是,則根據(jù)請求更新該變量。
4.當前語音播報完成時,檢查是否有待播放的最新請求,并且確定是否需要關閉頁面。
下面是一段示例代碼,它聲明了以上邏輯:
import android.media.MediaPlayer;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MediaPlayerActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
private Integer pendingAudioResId = null; // 存儲待播放的最新音頻資源ID
private boolean shouldFinishAfterCurrentAudio = false; // 是否在當前音頻播放結(jié)束后關閉頁面
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_media_player);
// 初始化MediaPlayer
mediaPlayer = new MediaPlayer();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (shouldFinishAfterCurrentAudio) {
finish(); // 如果應該在本次播報完畢后關閉頁面,則調(diào)用finish()
} else if (pendingAudioResId != null) {
playAudioResource(pendingAudioResId); // 播放最新的音頻請求
pendingAudioResId = null; // 重置待播放音頻ID
}
}
});
// 模擬接收播放請求
requestAudioPlayback(R.raw.audio_file_1);
// 假設在短時間后接收到多個播放請求
requestAudioPlayback(R.raw.audio_file_2);
requestAudioPlayback(R.raw.collection_complete); // 特殊指令“采集完成”
}
private void requestAudioPlayback(int audioResId) {
if (mediaPlayer.isPlaying()) {
// 如果當前有語音正在播放,更新待播放的音頻資源ID
pendingAudioResId = audioResId;
// 如果播放請求是“采集完成”,則設置標志位
if (audioResId == R.raw.collection_complete) {
shouldFinishAfterCurrentAudio = true;
}
} else {
playAudioResource(audioResId); // 否則直接播放音頻
}
}
private void playAudioResource(int resId) {
releaseMediaPlayer(); // 確保舊的MediaPlayer資源已釋放
mediaPlayer = MediaPlayer.create(this, resId);
if (mediaPlayer != null) {
mediaPlayer.start();
} else {
// 處理MediaPlayer創(chuàng)建失敗的情況
}
}
private void releaseMediaPlayer() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
releaseMediaPlayer(); // 清理MediaPlayer資源
}
}
這段代碼中,我們有以下關鍵點:
1.requestAudioPlayback: 此方法負責處理播放請求。如果當前有語音播放中,則記錄下最新的播放請求。如果特殊的“采集完成”請求被接收,將設置一個標志位以便在播放結(jié)束后關閉頁面。
2.playAudioResource: 負責播放給定資源ID的音頻文件,使用 MediaPlayer.create 方法來初始化MediaPlayer對象并開始播放。
3.onCompletionListener: 監(jiān)聽器會在每次音頻播放結(jié)束時觸發(fā)。它會檢查是否有新的播放請求待處理,或者是否需要關閉頁面。
請確保將 R.raw.audio_file_1, R.raw.audio_file_2 和 R.raw.collection_complete 替換為您自己項目中的相應資源。