我在我的父类中发布了一个MediaPlayer成员变量,在我启动之后,它不会调用onCompletion,或者至少onCompletionListener没有捕获它?我的代码看起来有点效果
mediaPlayer = Mediaplayer.create(this, currentSample);
mediaPlayer.start();
代码中的其他地方是我的onCompletionListener
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
if (repeatFlag == true) {
handler.removeCallbacks(sampleRunnable);
handler.postDelayed(sampleRunnable, delay);
}
}
});
我正在使用处理程序来调用sampleRunnable,因为我想以指定的延迟间隔循环它。但是,onCompletion似乎永远不会被调用。我对此非常肯定,因为我在onCompletion中设置了断点,它永远不会暂停程序,我试图单步执行它似乎永远不会被调用。有任何想法吗?
答案 0 :(得分:5)
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer arg0)
{
Log.v("Tag", "Completed");
}
});
此代码段工作正常。唯一的区别是“@Override”,我不确定“@Override”是否对代码产生影响。
答案 1 :(得分:4)
根据我的经验,在某些设备上不会触发监听器:/
答案 2 :(得分:1)
我也有这个问题。它与覆盖注释无关。
在配置Visualizer之前设置了侦听器。在我访问了可视化工具的MediaPlayer之后,我移动了setOnCompletionListener()
- 这解决了我的问题。确保在最新阶段调用该方法。
答案 3 :(得分:0)
我必须单独上课才能让它发挥作用。没有多少压倒一切。
private class SoundtrackPlayerListener implements MediaPlayer.OnCompletionListener{
public void onCompletion(MediaPlayer mp) {
//completion code here
}
}
答案 4 :(得分:0)
我和其他几位学生在我们的移动应用课程中遇到了同样的问题。
我不确定问题是什么,但对我们来说,这似乎是模拟器的一个错误。 在某些Linux机器上,OnCompletionEvent根本没有触发。在Mac上,事件在应用程序中触发,但不在单元测试中触发。
如果在真实设备而不是模拟器上执行,则(应用程序和单元测试)都能正常工作。
我们使用的AVD是三星Galaxy Tab(android2.2 api8)
答案 5 :(得分:0)
使用更新的Android版本(从8 Oreo开始),可能是由于应用程序进入睡眠状态而导致出现问题。这就是在我的应用中的原因。播放一首歌后就睡着了。
您可以检查并更改Android电池设置:
1.电池优化
2.点击“未优化”,然后点击“所有应用”
3.查找您的应用,并将设置更改为“未优化”
答案 6 :(得分:-1)
呀。我确认问题确实发生在某些设备上。我最新的Android手机遇到了这个问题,但不是旧问题。
除非您使用流式音频源,否则可以将mMediaPlayer.setOnCompletionListener(...)
替换为
new Timer().schedule(new TimerTask() {
@Override
public void run() {
actionWhenAudioEndIsReached();
}
}, mMediaPlayer.getDuration());
它应该工作:)