Android MediaPlayer語音 連續(xù) 播報

要實現(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 替換為您自己項目中的相應資源。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容