【问题标题】:MediaPlayer, not playing music on onResume() after having returned from an activityMediaPlayer,从活动​​返回后不在 onResume() 上播放音乐
【发布时间】:2013-01-31 10:40:50
【问题描述】:

在 MainActivity 上,我使用 MediaPlayer 播放背景音乐。

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    Music.playBGmusic(this, R.raw.main_music);
}

@Override
protected void onResume() {
      super.onResume();
      if ( ! Music.isPlaying(this) )
      {
          Music.playBGmusic(this, R.raw.main_music);
      }
}

在 Music.java 中:

public class Music {
   private static MediaPlayer mMainSound = null;
   public static boolean isPlaying(Context context)
   {
       if ( mMainSound != null )
       {
           return mMainSound.isPlaying();
       }
       return false;
   }

   public static void playBGmusic(Context context, int resource)
   {
       if ( mMainSound != null ) mMainSound.release();
       mMainSound = MediaPlayer.create(context, resource);
       mMainSound.setLooping(true);
       mMainSound.start();
   }

   public static void stopBGmusic(Context context) {
       if (mMainSound != null) {
           mMainSound.stop();
           mMainSound.release();
           mMainSound = null;
       }
   }
}

mMainSound 是一个 MediaPlayer 对象。我的 MainActivity 上有一个按钮,当它被点击时,它会创建一个意图,startActivity 那个意图。这个新活动以另一种声音调用playBGmusic。现在,当新活动调用stopBGmusic() finish() 以返回MainActivity 时,MainActivity 的onResume() 将按预期调用,它应该在后台播放main_music。实际发生的是,我只能听到不到一秒钟的音乐,然后就被切断了。在启动 MediaPlayer 之前,我尝试使用 prepare(),但这仍然不能解决问题。如果有人能为我澄清这个问题,我们将不胜感激..

也许我还应该提到在新活动中调用finish() 的位置,尽管我不确定这是否重要..

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_BACK:
            showDialog(1);
        break;
    }
    return true;
}  

@Override
protected Dialog onCreateDialog(int id) { //id is ignored
    Dialog dialog = null;
    AlertDialog.Builder builder;
    builder = new AlertDialog.Builder(this);
    builder.setMessage(R.string.return_home)
           .setCancelable(true)
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   finish();
               }
           })
           .setNegativeButton(R.string.cancel, null);
    dialog = builder.create();
    return dialog;
}

【问题讨论】:

  • 音乐是服务还是简单的课程?由于您正在播放背景,我假设它是一项服务。
  • 能否请您发布类名的顶部,以便我们可以看到您使用的接口和超类?
  • 是的,它只是一个简单的类。我编辑我的代码只是为了展示。我想我将不得不改变它
  • 要记住的一点是 onResume 总是会在 onCreate 之后被调用,所以你只需要设置媒体播放器在 onResume 中播放。
  • 是的,这是真的。我本来可以放: else { Music.playBGmusic(this, R.raw.main_music); } 在 onResume() 中。虽然这并不能解释为什么它会被切断。

标签: android


【解决方案1】:

您应该真正绑定一个服务来控制 MediaPlayer,而不是让您的主要活动控制它。相反,它应该通过您将服务绑定到您的应用来控制服务。

简单地说(假设您想在退出应用时继续播放音乐):

当您播放音乐时,您希望在后台运行它并让您的应用控制(开始/停止/暂停)媒体播放器的状态。创建媒体播放器时,您从后台播放而不是从前台播放。这允许您在用户运行您的服务时连续播放音乐。

可以使用 PendingIntent 与您的服务进行通信,通过捕获您特定的意图过滤器来设置通信。我建议您去 Google 开发网站学习一些教程,并尝试了解 Intent、intent-filter/action 和服务的原理,并了解活动和服务的生命周期。

要正确地做到这一点,您应该分配一些时间来研究/实验并了解 android。

【讨论】:

  • 您能详细说明一下吗?就像真正的问题是什么,以及如何解决它。对不起,我是 android 新手。
  • 实际上关闭应用程序时它不应该继续播放音乐,但我会调查该服务。我需要做的是,当从一个活动切换到另一个活动时,我需要播放不同的音乐。问题是当在 onResume() 中调用 playBGmusic() 时,不知何故这音乐被切断了
  • 嘿,实际上该代码只是我实际拥有的代码的 sn-p,结果证明 stopBGmusic() 和我在 onResume() 中的逻辑是问题所在。我有点忘记我做了什么..但我基本上清理干净了,现在可以了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多