我正在使用MediaController.MediaPlayerControl以在我的自定义视图底部显示MediaController,但我无法使其正常工作。当我第一次播放音乐时,应该有暂停按钮可见,但是有播放,当我按下该按钮时,音乐暂停,状态保持不变,然后正常工作。此外,当我播放下一首歌曲时,旧的MediaController小部件与新的小部件重叠。有时候,在播放音乐时,进度/搜索栏不会刷新。当按下MediaController上的某些内容时,它会自动更新(播放/暂停,转发等)。
我发现这些问题与我的相似,但我不认为他们得到的答案会解决我的问题。
这是我初始化控制器的方式:
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);
}
这就是我展示控制器的方式:
public void playMusic()
{
musicSrv.playSong(); //Play song in a service
setController();
controller.show(0);
controller.requestFocus();
}
答案 0 :(得分:11)
我确实遇到了这个问题。不知道你是否还需要帮助,但我还是认为我还要发帖。对于后代,您是否关注this tutorial?
首先,一个简单的问题是:由于重复调用setController()
,您将获得多个控件实例。将函数的第一行更改为:
if (controller == null) controller = new MusicController(this);
关于播放按钮发生故障,我相信它是因为你在音乐播放器准备好之前就已经显示它了(免责声明:我是新手Android我自己,以下是我发现有效的东西。
设置音乐播放服务的广播,以便在准备好音乐播放器时通知您的音乐控制活动。在音乐播放服务中附加以下功能以广播意图:
@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);
}
在您的音乐控制活动中设置广播接收器,以接收您的服务广播的意图。将以下类添加到您的活动中:
// 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);
}
};
在您的活动onResume()
方法中注册您的接收者:
// Set up receiver for media player onPrepared broadcast
LocalBroadcastManager.getInstance(this).registerReceiver(onPrepareReceiver,
new IntentFilter("MEDIA_PLAYER_PREPARED"));
根据您的代码结构,您必须进行一些整体整理。在我的代码中,我只调用了setController()
两次:来自我的活动中的onCreate()
和onResume()
方法。我也只从我的广播接收器和我的controller.show(0)
方法拨打onResume()
。