我正在使用 MediaController.MediaPlayerControl 以便在我的自定义 View 底部显示 MediaController,但我无法使其正常工作。当我第一次播放音乐时,应该会看到暂停按钮,但会播放,当我按下该按钮时,音乐会正确暂停,状态保持不变,之后它会正常工作。此外,当我播放下一首歌曲时,旧的 MediaController 小部件会与新的小部件重叠。有时在播放音乐时进度/搜索栏不会刷新。它只会在按下 MediaController 上的某些内容(播放/暂停、前进等)时自行更新。
我发现这些问题与我的相似,但我认为他们得到的答案不能解决我的问题。
- Android mediacontroller Play Pause controls not refresh properly
- Android MediaController seekbar not refreshing
- Android VideoView Playback Controls Show "Play" Initially Instead of "Pause" Even Though File is Already Playing
这是我初始化 Controller 的方式:
private void setController()
{
controller = new MusicController(this);
controller.setPrevNextListeners(new View.OnClickListener() {
@Override
public void onClick(View v) {
playNext();
}
}, new View.OnClickListener() {
@Override
public void onClick(View v) {
playPrev();
}
});
controller.setMediaPlayer(this);
controller.setAnchorView(findViewById(R.id.song_list));
controller.setEnabled(true);
}
这是我显示 Controller 的方式:
public void playMusic()
{
musicSrv.playSong(); //Play song in a service
setController();
controller.show(0);
controller.requestFocus();
}
最佳答案
我正好遇到了这个问题。不知道你是否还需要帮助,但我想我还是会发帖。为了后代,你在关注this tutorial吗? ?
首先,一个简单的问题:由于重复调用 setController()
,您将获得多个控件实例。将函数的第一行更改为:
if (controller == null) controller = new MusicController(this);
关于播放按钮故障,我相信是因为您在音乐播放器准备好之前就显示了它(免责声明:我自己是 Android 新手,以下是我发现有用的东西)。
从您的音乐播放服务设置一个广播,以便在音乐播放器准备就绪时通知您的音乐控制 Activity 。在您的音乐播放服务中将以下功能附加到广播 Intent :
@Override public void onPrepared(MusicPlayer player) { // Do some other stuff... // Broadcast intent to activity to let it know the media player has been prepared Intent onPreparedIntent = new Intent("MEDIA_PLAYER_PREPARED"); LocalBroadcastManager.getInstance(this).sendBroadcast(onPreparedIntent); }
在您的音乐控制 Activity 中设置一个广播接收器,以接收您的服务广播的 Intent。将以下类添加到您的 Activity 中:
// Broadcast receiver to determine when music player has been prepared private BroadcastReceiver onPrepareReceiver = new BroadcastReceiver() { @Override public void onReceive(Context c, Intent i) { // When music player has been prepared, show controller controller.show(0); } };
在您的 Activity 的
onResume()
方法中注册您的接收器:// Set up receiver for media player onPrepared broadcast LocalBroadcastManager.getInstance(this).registerReceiver(onPrepareReceiver, new IntentFilter("MEDIA_PLAYER_PREPARED"));
根据您的代码结构,您必须进行一些常规整理。在我的代码中,我只调用了
setController()
两次:从我的 Activity 中的onCreate()
和onResume()
方法调用。我也只从我的广播接收器和我的onResume()
方法调用controller.show(0)
。
关于Android MediaController 播放/暂停按钮和 Seekbar 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357040/