【问题标题】:MediaPlayer stops playing when running within a serviceMediaPlayer 在服务中运行时停止播放
【发布时间】:2013-07-25 04:37:19
【问题描述】:

我正在使用 MediaPlayer 播放循环音频。它需要在服务中播放。几秒钟后,它终止。我检查了我的服务是否仍在运行,并且确实如此。当我将代码移动到一个活动时,它运行良好并且永不停止。这使我相信问题与线程有关。在活动中,MediaPlayer 在 UI 线程上运行,但在我的服务中,它在自己的线程中运行,并且未绑定到 UI 线程。也许这与它有关。我还将我的 MediaPlayer 对象声明为私有静态字段,但这也无济于事。

Logcat 仅表示“媒体服务器死亡”,没有进一步的原因。

如果 MediaPlayer 需要在 UI 线程中运行,我将如何从服务或由该服务产生的任何线程中访问它?

我在 Android 4.1 上遇到了这个问题。代码大致如下:

class PlaySound implements Runnable
{
  private static MediaPlayer mp;

  public void run()
  {
      this.mp = MediaPlayer.create(this.context, R.raw.sound);
      this.mp.setVolume(1, 1);
      this.mp.setLooping(true);
      this.mp.start();

      do
      {
        // Do something until told to stop thread.
      }
      while (true);
  }
}

我还将私有字段移到我的服务中,甚至删除了 do...while 以便线程可以在播放开始后立即终止,但这也无济于事。

编辑:

这似乎是 Android 4.1 中的一个问题。我在同一制造商的设备上在 2.3 上测试了我的应用程序,但没有遇到此问题。事实上,2.3 版设备的资源少得多,处理器也更慢,所以如果资源有问题,它应该被终止。

【问题讨论】:

  • 我看不到你给mp.prepare();打电话?
  • create(): "为给定资源 id 创建 MediaPlayer 的便捷方法。成功后,prepare() 将已被调用,不得再次调用。"
  • 我的错,没有注意到你正在使用create()。我认为您应该发布更多服务代码以及您实际启动它的方式,以便我们提供帮助。
  • hi AndroidDev.你找到解决方案了吗?
  • 在使用带有 resId 的 create 时无需调用 mp.prepare()。只需确保你的线程中有 sleep()-s,让 mp 有时间播放声音。

标签: android media-player


【解决方案1】:

这里的问题是我在由服务管理的线程内创建了一个 MediaPlayer。使用 Handler(getMainLooper()) 启动和停止 MediaPlayer。

final Handler handler = new Handler(getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
   mediaPlayer.start();
}
});

handler.postDelayed(new Runnable() {
@Override
public void run() {
if (mediaPlayer.isPlaying()) {
     mediaPlayer.stop();
}
}
, 30 * 1000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多