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

时间:2009-05-22 04:31:48

标签: android

我正在使用MediaPlayer实例来从Internet位置流式传输音频文件。音频播放器属于单独的活动。用户可以从音频文件列表中进行选择,并参加此活动以播放音频。

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

有什么方法可以让我知道音频文件是否在播放而不必保留MediaPlayer对象?

感谢。

修改

我确实知道如何知道音频是否正在播放。 我们可以通过使用AudioManager的对象并调用isAudioPlaying()来实现。如果播放任何音频,这将返回true。

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

5 个答案:

答案 0 :(得分:10)

您需要在MediaPlayer个实例上调用stop()。要在您的应用程序中使其工作,您需要:

  • 在音频播放活动(stop())中呼叫onDestroy(),例如
  • 创建Service以播放音频,并通过两种活动与其进行通信

使用Service将允许您的代码继续在Activity生命周期之外运行,并且是在这种情况下保持MediaPlayer对象的唯一方法。

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

答案 1 :(得分:2)

@lostintransit“使用服务,静态变量还是单例类会更好吗?什么是更好的设计选项?”

我认为服务就是你想要的。内置媒体播放器和Pandora的应用程序都使用服务来确保音乐与活动生命周期无关。

如果我理解你为什么使用单身或静态,我认为它不会达到你想要的效果。单例/静态只能在Linux中的单个进程中强制执行。如果您启动Activity,然后关闭它,然后再次启动它们,它们将在不同的进程中运行。

答案 2 :(得分:2)

我找到了检查音频流(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;
}

答案 3 :(得分: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");
    }

答案 4 :(得分:1)

试试这个......

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

其中mp1是MediaPlayer