java - 为什么我需要点击两次才能播放音频
问题描述
我创建了一个 MediaPlayer 以使用相同的按钮播放音频。当我第一次单击播放音频时,它是工作的,之后当我再次按下播放相同的音频时,我必须单击另一次按下播放音频(2 次)。我怎样才能解决这个问题。
我使用的播放音频方法
private void playAudio() {
Button button = findViewById(R.id.play_audio);
button.setOnClickListener(v -> {
if (mediaPlayer == null) {
final AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
final int originalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
mediaPlayer = MediaPlayer.create(Main.this, R.raw.testa);
mediaPlayer.start();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnCompletionListener(mp1 -> mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0));
} else {
mediaPlayer.stop();
mediaPlayer = null;
}
});
}
解决方案
原因很明显,点击监听器中有两个分支,只有一个分支允许播放 mediaPlayer;所以你必须在第一次点击时掉入另一个分支。
一个可能的解决方法是在播放完成时强制释放 mediaPlaer 资源,以便您始终确保在下次单击时转到第一个分支:
mediaPlayer.setOnCompletionListener(mp1 -> {
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, originalVolume, 0);
mediaPlayer.release();
mediaPlayer = null;
});
推荐阅读
- dialogflow-es - 如何访问 Google 助理命令(IFTTT 与 DialogFlow)?
- python - 如何使用机器人框架从列表中获取基于键的特定值?
- android - 如何在 Android 上获取设备的 SSID?
- c# - 如何模拟 ModuleClient?
- postgresql - 恢复时内存不足,即使内存中有空间
- c# - C#:打印出Word文档而不预先保存document.PrintOut()
- php - laravel 中逗号分隔列中的精确单词匹配
- subdomain - 支持 CloudFront 中的多个子域
- android - 设置 FragmentAdapter 时屏幕冻结
- apple-push-notifications - 从 NotificationContent Extension - iOS 导航到特定视图控制器