2009-05-22 176 views
7

我正在使用MediaPlayer实例来播放来自Internet位置的音频文件。音频播放器在单独的活动中。用户可以从音频文件列表中进行选择并来此活动播放音频。Android - 查找音频是否正在播放并停止播放

现在用户可能会返回到先前的活动(使用列表)并选择另一个音频文件。在这种情况下,我想停止正在播放的其他任何音频,并开始播放选定的新音频。

有什么方法可以知道音频文件是否正在播放,而无需保留MediaPlayer对象?

谢谢。

编辑

我也了解如何知道声音是否正在播放。 我们可以通过使用AudioManager的对象并调用isAudioPlaying()来完成。如果有任何音频正在播放,这将返回true。

现在的另一个问题,我该如何停止正在播放的音频?我没有创建用于启动音频的MediaPlayer对象的实例(因为用户已经离开活动一次,并返回活动的新对象,因此MediaPlayer的新实例)

回答

10

您需要在MediaPlayer实例上调用stop()。为了使你的应用程序这项工作,你要么需要:

  • 呼叫stop()音频播放活动中(在onDestroy()),例如
  • 创建Service播放音频,并从与它进行通信这两项活动

使用Service将让你的代码继续运行该活动的生命周期之外,并且是像你这种情况下,需要坚持一个MediaPlayer对象的唯一途径。

或者,您可能可以创建Application的自定义子类并将MediaPlayer存储在那里,但使用Service被认为是更好的做法。

+0

谢谢。使用服务,静态变量还是单例类会更好吗?什么是更好的设计选择? – lostInTransit 2009-05-27 05:14:40

2

下面是一些方便的代码睡觉,直到音频播放完毕:

AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
    while(manager.isMusicActive()) 
    { 
     Log.d("music", "music is active"); 
     try 
     { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) 
     { 
      Log.e("music", "interrupted waiting for music to stop"); 
     } 
     Log.d("music", "done playing music"); 
    } 
+1

这不做任何事情,有人几乎不会使它有用 – sandalone 2012-12-06 13:03:19

2

@lostintransit“会不会更好使用一个服务,一个静态变量或一个单独的类会是什么更好的设计选项?”

我认为服务是你想要的。内置媒体播放器和潘多拉的应用程序都使用服务来确保音乐不受活动生命周期的束缚。

如果我明白你为什么要使用单身或静态我不认为它会完成你想要的。单例/静态只能在Linux的单个进程中执行。如果您启动您的活动,然后关闭它,然后再次启动它们,它们将运行在不同的进程中。

1

试试这个......

if (mp1 != null && mp1.isPlaying()) { 
       mp1.stop(); 
      } 

其中MP1为MediaPlayer

+1

如果mp1对象在应用程序关闭时已被销毁,这将不起作用。 – sandalone 2012-12-06 13:02:55

1

我发现的方法来检查音频流(AudioManager.STREAM_RING,AudioManager.STREAM_NOTIFICATION等)是否是目前正忙于使用反射:

/** 
* Unhide android api: check is stream is active now (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION...), 
* uses reflection 
* @param audioStream 
* @return 
*/ 
public static boolean isStreamActive(int audioStream) { 
    Class<?> audioSystemClazz = null; 
    Boolean res = false; 
    try { 
     audioSystemClazz = Class.forName("android.media.AudioSystem"); 
     if (null != audioSystemClazz) { 
      // isStreamActive 
      Method method = audioSystemClazz.getDeclaredMethod("isStreamActive", new Class<?>[] { int.class, 
        int.class }); 
      if (null != method) { 
       res = (Boolean) method.invoke(null, audioStream, 0); 
      } 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

    return res; 
}