我的应用程序是一个音乐键盘,允许用户通过按下将播放特定声音的按钮来创建自己的音乐,如果用户按下多个按钮,则会有更多声音同时播放。
我想在调用onPause()时停止所有声音。但我意识到,如果同一个媒体播放器对象播放多个声音,它只会停止归因于它的最后一个声音,而其他声音则继续播放。
用户接听电话并让我的应用听起来仍在播放会非常不愉快:p
任何帮助都将不胜感激。
@Override
protected void onPause() {
super.onPause();
try {
while (mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.release();
}
}catch (IllegalStateException e){
//Do nothing
}
}
修改
我尝试实现SoundPool API,但由于我的应用程序非常动态(用户可以上传他们的样本并使用麦克风录制)。我已经实现了一切并且运行良好,现在将其更改为另一个API而不是MediaPlayer会很麻烦。 有没有办法阻止归因于MediaPlayer对象并且当前正在播放的所有声音?可能访问其他一些类并使用其他方法来阻止所有声音?
答案 0 :(得分:0)
我建议您查看SoundPool API。它看起来很适合您的任务。它允许您预加载声音文件并独立播放它们。
SoundPool类管理和播放应用程序的音频资源。
SoundPool是一组样本,可以从APK内部的资源或文件系统中的文件加载到内存中。 SoundPool库使用MediaPlayer服务将音频解码为原始的16位PCM单声道或立体声流。这允许应用程序附带压缩流,而不必承受CPU负载和播放期间解压缩的延迟。
答案 1 :(得分:0)
经过一些研究和反复试验后,我发现没有办法阻止同一个MediaPlayer物体播放的所有声音,你只能控制归于它的最后声音,所有其他声音继续直到他们结束或应用程序被破坏。
好的,我做的是:
我为音乐键盘的每个键音创建了一个对象,并使用以下代码覆盖onPause():
@Override
protected void onPause() {
super.onPause();
if (mAudioManager.isMusicActive()){
for (MediaPlayer aMMediaPlayer : mMediaPlayer) {
if (aMMediaPlayer != null) {
try {
if (aMMediaPlayer.isPlaying()) {
aMMediaPlayer.stop();
aMMediaPlayer.release();
}
} catch (IllegalStateException e) {
//Do nothing
}
}
}
}
}