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

los*_*sit 8 android

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

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

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

谢谢.

编辑

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

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

小智 10

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

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

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

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


ult*_*aon 5

我找到了使用反射检查音频流(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;
}
Run Code Online (Sandbox Code Playgroud)