Android -查找当前是否正在播放音频并停止它

wrrgggsh  于 2023-06-27  发布在  Android
关注(0)|答案(6)|浏览(447)

我正在使用MediaPlayer示例,以便从Internet位置流式传输音频文件。音频播放器处于单独的Activity中。用户可以从音频文件列表中进行选择,然后进入此活动以播放音频。
现在,用户可以返回到上一个Activity(带有列表)并选择另一个音频文件。在这种情况下,我想停止正在播放的任何其他音频,并开始播放所选的新音频。
有没有什么方法可以让我知道一个音频文件是否正在播放,而不必保留MediaPlayer对象?
谢谢

编辑

我确实找到了如何知道音频是否正在播放的方法。我们可以通过使用AudioManager对象并调用isAudioPlaying()来实现。如果正在播放任何音频,则将返回true。
现在另一个问题,**我如何停止正在播放的音频?**我没有创建用于启动音频的MediaPlayer对象的示例(因为用户已经离开Activity一次,并带着Activity的新对象和MediaPlayer的新示例返回)

wvt8vs2t

wvt8vs2t1#

您需要在MediaPlayer示例上调用stop()。要在您的应用程序中实现此功能,您需要:

  • 例如,在音频播放活动(在onDestroy()中)中调用stop()
  • 创建一个Service来播放音频,并从两个Activity与它进行通信

使用Service将允许您的代码在Activity生命周期之外继续运行,并且是持久化MediaPlayer对象的唯一方法,就像您在这种情况下需要的那样。
或者,您也可以创建Application的自定义子类并将MediaPlayer存储在那里,但使用Service被认为是更好的做法。

fdx2calv

fdx2calv2#

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

  1. /**
  2. * Unhide android api: check is stream is active now (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION...),
  3. * uses reflection
  4. * @param audioStream
  5. * @return
  6. */
  7. public static boolean isStreamActive(int audioStream) {
  8. Class<?> audioSystemClazz = null;
  9. Boolean res = false;
  10. try {
  11. audioSystemClazz = Class.forName("android.media.AudioSystem");
  12. if (null != audioSystemClazz) {
  13. // isStreamActive
  14. Method method = audioSystemClazz.getDeclaredMethod("isStreamActive", new Class<?>[] { int.class,
  15. int.class });
  16. if (null != method) {
  17. res = (Boolean) method.invoke(null, audioStream, 0);
  18. }
  19. }
  20. } catch (ClassNotFoundException e) {
  21. e.printStackTrace();
  22. } catch (NoSuchMethodException e) {
  23. e.printStackTrace();
  24. } catch (IllegalAccessException e) {
  25. e.printStackTrace();
  26. } catch (IllegalArgumentException e) {
  27. e.printStackTrace();
  28. } catch (InvocationTargetException e) {
  29. e.printStackTrace();
  30. }
  31. return res;
  32. }
展开查看全部
x8goxv8g

x8goxv8g3#

这里有一些方便的代码,可以让你在播放完音频之前一直处于睡眠状态:

  1. AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
  2. while(manager.isMusicActive())
  3. {
  4. Log.d("music", "music is active");
  5. try
  6. {
  7. Thread.sleep(500);
  8. }
  9. catch (InterruptedException e)
  10. {
  11. Log.e("music", "interrupted waiting for music to stop");
  12. }
  13. Log.d("music", "done playing music");
  14. }
4smxwvx5

4smxwvx54#

@lostintransit“使用服务、静态变量还是单例类更好?更好的设计方案是什么?“
我觉得你想要的是服务。内置的媒体播放器和Pandora的应用程序都使用一项服务来确保音乐不与Activity生命周期相关联。
如果我理解你为什么要使用单例或静态,我不认为它会实现你想要的。singleton/static只在Linux中的单个进程中执行。如果您启动Activity,然后关闭它,然后再次启动它,它们将在不同的进程中运行。

rbpvctlc

rbpvctlc5#

试试这个...

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

其中mp1是MediaPlayer

a7qyws3x

a7qyws3x6#

参数给予AudioManager.STREAM_RING即可

  1. public static boolean isStreamActive(int audioStream) {
  2. Class<?> audioSystemClazz = null;
  3. Boolean res = false;
  4. try {
  5. audioSystemClazz = Class.forName("android.media.AudioSystem");
  6. if (null != audioSystemClazz) {
  7. // isStreamActive
  8. Method method = audioSystemClazz.getDeclaredMethod("isStreamActive", new Class<?>[] { int.class,
  9. int.class });
  10. if (null != method) {
  11. res = (Boolean) method.invoke(null, audioStream, 0);
  12. }
  13. }
  14. } catch (ClassNotFoundException e) {
  15. e.printStackTrace();
  16. } catch (NoSuchMethodException e) {
  17. e.printStackTrace();
  18. } catch (IllegalAccessException e) {
  19. e.printStackTrace();
  20. } catch (IllegalArgumentException e) {
  21. e.printStackTrace();
  22. } catch (InvocationTargetException e) {
  23. e.printStackTrace();
  24. }
  25. return res;

}

展开查看全部

相关问题