public class MediaPlayerUtil {
private final String tag = "MediaPlayerUtil";
private MediaPlayer mediaPlayer;
private ExecutorService executorService;
private MediaPlayerUtil() {}
// 内部单例类,安全简洁
private static class SingletonInstance {
private static final MediaPlayerUtil INSTANCE = new MediaPlayerUtil();
}
public static MediaPlayerUtil getInstance() {
return SingletonInstance.INSTANCE;
}
private synchronized void init() {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
if (executorService == null) {
executorService = Executors.newSingleThreadExecutor();
}
}
/**
* 播放
* 使用execute方便抛出异常
* @param voiceFilePath
*/
public void play(String voiceFilePath) {
if (TextUtils.isEmpty(voiceFilePath)) {
Logger.e(tag, "startVoicePlayer path is Empty");
return;
}
init();
executorService.execute(() -> playFile(voiceFilePath));
}
/**
* 释放media play、线程池
*/
public void release() {
init();
executorService.execute(() -> stopPlay());
}
private void playFile(String path) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(path);
// 通过异步的方式装载媒体资源
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Logger.v(tag, "startVoicePlayer onPrepared");
OnTrackAnalytics.trackEvent(UsageStatistics.TRANSLATE_VOICE_PLAY);
// 装载完毕回调
mediaPlayer.start();
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Logger.v(tag, "startVoicePlayer onCompletion");
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Logger.e(tag, "startVoicePlayer onError");
stopPlay();
return false;
}
});
} catch (IOException e) {
e.printStackTrace();
Logger.e(tag, "startVoicePlayer IOException:" + e);
}
}
private void stopPlay() {
// 释放播放器
if (mediaPlayer != null) {
mediaPlayer.setOnCompletionListener(null);
mediaPlayer.setOnErrorListener(null);
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
if (executorService != null) {
executorService.shutdown();
executorService = null;
}
}
}