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

标签 android mediacontroller android-music-player

我正在使用 MediaController.MediaPlayerControl 以便在我的自定义 View 底部显示 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

这是我初始化 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 新手,以下是我发现有用的东西)。

  1. 从您的音乐播放服务设置一个广播,以便在音乐播放器准备就绪时通知您的音乐控制 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);
    }
    
  2. 在您的音乐控制 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);
        }
    };
    
  3. 在您的 Activity 的 onResume() 方法中注册您的接收器:

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

关于Android MediaController 播放/暂停按钮和 Seekbar 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25357040/

相关文章:

android - 制作自己的系统栏

android - 我正在尝试创建一个媒体 Controller 来控制我的音频文件

android - MediaController上的“播放/暂停”按钮不会单独刷新音频播放器

android - VideoView 播放状态或 MediaController 播放/暂停的事件

android - 从Android mp3歌曲中获取ArtistImage

android - OSM Magsforge(离线) map 中点和路径之间的最短距离

android - 无法在自定义 ListView 中获取个人资料图像和按钮图像

java - Android、Gradle 产品 flavor ;包不存在

android - MusicPlayer Pause and Start 从它开始

Android:尝试使用输入播放列表从我的应用启动音乐播放器