```
List<String> voicePlay = VoiceTextTemplate.genVoiceListByBean(builder);
if (voicePlay == null || voicePlay.isEmpty()) {
return;
}
mExecutorService.execute(() -> startPlayAudio(voicePlay));
```
private void startPlayAudio(final List<String> nameList) {
if (nameList == null || nameList.isEmpty()) {
return;
}
playWithDelay(nameList, 0);
}
private void playWithDelay(final List<String> nameList, final int index) {
if (index >= nameList.size()) {
return;
}
synchronized (VoicePlay.this) {
final CountDownLatch mCountDownLatch = new CountDownLatch(1);
SimpleExoPlayer player = ExplayerNetUtil.getInstance(mContext).getCurrentPlayer();
player.stop();
String resourceName = nameList.get(index);
int resId = mContext.getResources().getIdentifier(resourceName, "raw", mContext.getPackageName());
if (resId == 0) {
Log.w("VoicePlay", "Resource not found: " + resourceName);
playWithDelay(nameList, index + 1);
return;
}
Uri uri = getByUri(mContext, resId);
MediaSource mediaSource = new ExtractorMediaSource.Factory(
ExplayerNetUtil.getInstance(mContext).getDataSourceFactory()
)
.setExtractorsFactory(ExplayerNetUtil.getInstance(mContext).getDefaultExtractorsFactory())
.createMediaSource(uri);
player.setAudioAttributes(
new com.google.android.exoplayer2.audio.AudioAttributes.Builder()
.setContentType(C.CONTENT_TYPE_SPEECH)
.setUsage(C.USAGE_MEDIA)
.build()
);
player.setPlaybackParameters(new PlaybackParameters(1.0f));
player.addListener(new Player.EventListener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
if (playbackState == Player.STATE_ENDED) {
mCountDownLatch.countDown();
}
}
@Override
public void onPlayerError(ExoPlaybackException error) {
Log.e("VoicePlay", "Playback error", error);
mCountDownLatch.countDown();
}
@Override public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {}
@Override public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {}
@Override public void onLoadingChanged(boolean isLoading) {}
@Override public void onRepeatModeChanged(int repeatMode) {}
@Override public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {}
@Override public void onPositionDiscontinuity(int reason) {}
@Override public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}
@Override public void onSeekProcessed() {}
});
player.prepare(mediaSource);
player.setPlayWhenReady(true);
try {
boolean completed = mCountDownLatch.await(30, TimeUnit.SECONDS);
if (completed) {
Thread.sleep(10);
} else {
Log.w("VoicePlay", "Playback timed out for index: " + index);
}
playWithDelay(nameList, index + 1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
Log.e("VoicePlay", "Thread interrupted", e);
}
}
}