【问题标题】:How to stop mediaplayer while playing on background?如何在后台播放时停止媒体播放器?
【发布时间】:2021-07-28 22:01:24
【问题描述】:

我正在 Android 上开发一个音乐播放器,该应用有两个活动(MainActivity 和 PlayActivity)。在 MainActivity 中,我有一个包含歌曲列表的列表视图,在 PlayActivity 中,我有一个按钮来收听和暂停音乐。问题是当回到 MainActivity 并从列表视图中选择一首新歌时,第一首继续在后台播放,而第二首也开始播放。当我选择一首新歌时,如何停止第一首歌曲? (我不想停止媒体播放器 onBackPressed,我只想在从列表视图中选择另一首歌曲并在 PlayActivity 中播放新歌曲时停止音乐)

编辑:我正在使用 AsyncTask 在 PlayActivity 上启动媒体播放器:mp.prepareAsync();

【问题讨论】:

  • 哪个组件拥有媒体播放器?它是否托管在Service 中?
  • 我正在使用:prepareAsync()
  • 用什么Context来创建播放器?

标签: android android-mediaplayer


【解决方案1】:

onBackPressed() 时,您可以尝试停止MediaPlayer

MediaPlayer  mp ; // mp is your MediaPlayer

@Override
public void onBackPressed() {
    if (mp != null) {
        mp.stop();
        mp.release();
        mp = null;
    }
    super.onBackPressed();
}

【讨论】:

    【解决方案2】:
    private void playMusic() {
        if (mp != null) {
            if (mp.isPlaying()) {
                mp.stop();
                mp.release();
    
                MediaPlayer copyMp = new MediaPlayer();
    
                try {
                    copyMp.setDataSource("/path");
                    mp = copyMp;
                    mp.prepare();
                    mp.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      来自here

      MediaPlayer 不是线程安全的。创建和访问播放器 实例应该在同一个线程上。

      这意味着您必须在整个应用程序中维护一个媒体播放器实例(根据您的要求)。我不知道您如何实现媒体播放器(服务/AsyncTask 等)。当您选择一首新歌曲时,您需要访问该实例并将现有歌曲替换为所选歌曲。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-17
        相关资源
        最近更新 更多