Android MediaController播放/暂停按钮和Seekbar不刷新

时间:2014-08-18 05:49:51

标签: android mediacontroller android-music-player

我正在使用MediaController.MediaPlayerControl以在我的自定义视图底部显示MediaController,但我无法使其正常工作。当我第一次播放音乐时,应该有暂停按钮可见,但是有播放,当我按下该按钮时,音乐暂停,状态保持不变,然后正常工作。此外,当我播放下一首歌曲时,旧的MediaController小部件与新的小部件重叠。有时候,在播放音乐时,进度/搜索栏不会刷新。当按下MediaController上的某些内容时,它会自动更新(播放/暂停,转发等)。

我发现这些问题与我的相似,但我不认为他们得到的答案会解决我的问题。

  1. Android mediacontroller Play Pause controls not refresh properly
  2. Android MediaController seekbar not refreshing
  3. Android VideoView Playback Controls Show "Play" Initially Instead of "Pause" Even Though File is Already Playing
  4. 这是我初始化控制器的方式:

    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();
    }
    

1 个答案:

答案 0 :(得分:11)

我确实遇到了这个问题。不知道你是否还需要帮助,但我还是认为我还要发帖。对于后代,您是否关注this tutorial

首先,一个简单的问题是:由于重复调用setController(),您将获得多个控件实例。将函数的第一行更改为:

if (controller == null) controller = new MusicController(this);

关于播放按钮发生故障,我相信它是因为你在音乐播放器准备好之前就已经显示它了(免责声明:我是新手Android我自己,以下是我发现有效的东西。

  1. 设置音乐播放服务的广播,以便在准备好音乐播放器时通知您的音乐控制活动。在音乐播放服务中附加以下功能以广播意图:

    @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);
    }
    
  2. 在您的音乐控制活动中设置广播接收器,以接收您的服务广播的意图。将以下类添加到您的活动中:

    // 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);
        }
    };
    
  3. 在您的活动onResume()方法中注册您的接收者:

    // Set up receiver for media player onPrepared broadcast
    LocalBroadcastManager.getInstance(this).registerReceiver(onPrepareReceiver,
            new IntentFilter("MEDIA_PLAYER_PREPARED"));
    
  4. 根据您的代码结构,您必须进行一些整体整理。在我的代码中,我只调用了setController()两次:来自我的活动中的onCreate()onResume()方法。我也只从我的广播接收器和我的controller.show(0)方法拨打onResume()