【发布时间】:2014-12-30 09:06:15
【问题描述】:
我正在尝试在应用中实现基本的 MediaPlayer,并根据剪辑是否正在播放、播放已完成或手动中断播放(通过按下相同的按钮)来改变按钮的状态。
使用下面的代码,我得到以下结果:
首次加载时,音频播放正常。
如果我在播放过程中再次按下 ImageButton,播放将停止。当我再次按下它时,播放会从它停止的时间戳恢复(我认为这是更典型的“pause()”的奇怪行为。
播放完成后,按钮更改可以正常工作,但是我无法再次播放音频文件。当我按下开始时,它开始播放,然后立即过渡到播放完成,而不实际播放音频。
我一直在搜索其他帖子/google/android 文档,但还没有找到解决方案。
到目前为止我也尝试过:
setLooping(true); - 除了永远无法达到 setOnCompletionListener 之外,这根本没有任何影响。音频根本没有重播。
1234563它从位置 0 或 100 开始,结果仍然相同(没有听到音频并立即完成)。
-
在onCompletion方法中,调用“stop()”、“prepareAsync()”甚至prepare()的几种组合。结果是相同的,但是在随后的播放尝试(即尝试 2、3 等)中,当调用 onCompletion 方法时,我开始收到各种错误,因为在不正确的状态下调用 stop() / prepare() 方法。
final ImageButton pauseButton = (ImageButton) rootView.findViewById(R.id.playButton1); final MediaPlayer mediaPlayer = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.ch01_01); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { pauseButton.setImageResource(R.drawable.play_button); } }); pauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mediaPlayer.isPlaying()) { mediaPlayer.stop(); mediaPlayer.prepareAsync(); pauseButton.setImageResource(R.drawable.play_button); } else { mediaPlayer.start(); pauseButton.setImageResource(R.drawable.stop_button); } } });
任何帮助将不胜感激!
附:我将 onCreateView 方法中的所有这些代码用于我的应用程序中的片段。以防万一有人认为这可能是相关的。
【问题讨论】:
-
我看到两条奇怪的线。停止播放器后的第一个 mediaPlayer.prepareAsync() 。 prepareAsync() 方法触发 onPrepared 侦听器,之后您可以启动播放器。因此,您必须将 prepareAsync 行移至“else”块,将 mediaPlayer.start() 从 else 块移至 onPrepared 方法。将 setOnPrepared 侦听器附加到 mediaPlayer。请查看此图:developer.android.com/images/mediaplayer_state_diagram.gif
-
您好,感谢您的回复!您注意到的异常只是我正在玩的一些东西,看看我在 stop() 时是否得到相同的行为; vs 当它处于 Completed 状态时。我删除了 stop();和准备异步();并用 pause() 代替。这个暂停功能工作正常,这不是我目前的问题。我只是希望它完成后能够从头开始播放。一旦完成,它就不会再次播放,直到我退出活动并重新进入。当它处于 PlaybackCompleted 时,我应该能够 seekTo(0) 并重新开始,但它不起作用。
-
所以,我一直在我的三星 Galaxy S2 上运行它(运行 Kitkat 4.4.4 Cyanogenmod)。我尝试在运行 Lollipop 的 Google Nexus 7 (2013) 上运行,它完全符合我的要求。浪费了好几个小时sigh