10

嗨,我是新手。我的自学项目是一个播放音频新闻流的小应用程序。为了有效,应用程序确实需要中断任何当前正在播放的媒体播放器(例如:Last FM、Imeem、音乐播放器、Spotify 等)。

我不知道将播放什么或将播放什么应用程序,但我想请他们暂停,直到我完成。听起来相当大胆,我知道,但这一定是可能的,因为当有来电时,基本上就是这样。

我可以向所有音频播放器发送一条消息,要求他们暂停片刻吗?我可以欺骗来电,只是为了它需要的时间?

谢谢。

4

4 回答 4

18

Android 上的音频处理将在一段时间内变得非常糟糕。API 非常奇怪,文档记录不完善,并且在版本之间不断变化/弃用/破坏。甚至AudioManager代码中也有 FIXME。

无论如何,Android 中有几种流类型(音乐、通知、电话等),应用程序旨在选择合适的一种进行播放。我想大多数 Android 应用程序都应该使用音乐/媒体类型 ( STREAM_TYPE_MUSIC)。你在你MediaPlayer使用的setAudioStreamType方法上设置了这个。

SDK 确实允许您将单个流类型设置为独奏 - 导致所有其他流被静音 - 但我不相信您可以识别特定应用程序正在播放的音频并以某种方式暂停/取消暂停它。音乐应用程序通常会PhoneStateListener在来电时使用 暂停自己。

因此,在您的情况下,您可以为您“借用”电话流并在播放开始时MediaPlayer使用方法调用,然后在播放或​​完成时取消流的独奏。AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true)falseActivity

我可以告诉你这行得通,但我不记得在使用语音呼叫流时是否还需要将音频模式设置为(像这样:) 。如果您发现需要这样做,那么您需要确保在播放完成后返回模式,否则无论何时按下音量硬键,它都会显示“通话中音量”!但是,如果您确实想改回,则必须检查当时没有发生真正的电话...MODE_IN_CALLAudioManager.setMode(AudioManager.MODE_IN_CALL)MODE_NORMALMODE_NORMAL

也许您可以使用另一种流类型而不是语音呼叫类型,但我只是从开发可以使用扬声器电话或听筒进行音频播放的应用程序的经验中说出来,这需要使用语音呼叫流。

就像我说的那样,音频处理并不是特别有趣……;)

于 2010-01-03T18:24:54.680 回答
6

已经2年了。但我希望这可以帮助某人:

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);

注意:如果调用setStreamMute(int, boolean)将流静音n次,则必须再次调用它n次才能取消静音(使用false)。

于 2012-03-18T17:35:35.960 回答
2

合适的方法是使用AudioManager.requestAudioFocus(...)方法

http://developer.android.com/reference/android/media/AudioManager.html#requestAudioFocus%28android.media.AudioManager.OnAudioFocusChangeListener,%20int,%20int%29

于 2013-03-08T02:51:07.127 回答
0

您可以尝试AudioManager.adjustVolume方法:

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
于 2010-01-03T11:46:41.313 回答