嗨,我是新来的。我的自学项目是一个播放音频新闻流的小应用程序。为了有效,应用程序确实需要中断任何当前播放的媒体播放器(例如:Last FM,Imeem,音乐播放器,Spotify等)。
我不知道将播放什么或将播放什么应用程序,但我想让他们都暂停,直到我完成。听起来相当大胆,我知道,但它必须是可能的,因为当有来电时,基本上就会发生这种情况。
我可以向所有要求他们暂停一下的音频播放器发送消息吗?我可以欺骗来电,只是花费时间吗?
感谢。
答案 0 :(得分:18)
Android上的音频处理在一段时间内会非常糟糕。 API非常奇怪,文档记录很差,并且在版本之间不断变化/弃用/中断。即使AudioManager
代码中也包含FIXME。
无论如何,Android中有多种流类型(音乐,通知,电话等),应用程序用于选择合适的播放类型。我想大多数Android应用都应该使用音乐/媒体类型(STREAM_TYPE_MUSIC
)。您可以使用MediaPlayer
方法在setAudioStreamType
上设置此项。
SDK允许您将单个流类型设置为solo - 导致所有其他流被静音 - 但我不相信您可以识别特定应用程序正在播放的音频以某种方式暂停/取消暂停。音乐应用程序通常会在呼叫进入时使用PhoneStateListener
暂停。
因此,在您的情况下,您可以“借用”MediaPlayer
的电话呼叫流,并在播放开始时使用方法调用AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true)
,然后使用false
取消独奏流播放或Activity
完成后。
我可以告诉你这个有效,但我不记得你在使用语音呼叫流时是否需要将音频模式设置为MODE_IN_CALL
(如下所示: AudioManager.setMode(AudioManager.MODE_IN_CALL)
)。如果您发现这是必需的,那么您需要确保在播放完成后将模式返回到MODE_NORMAL
,否则无论何时按音量硬键,它都会说“通话音量”!但是,如果您确实想要更改回MODE_NORMAL
,则必须检查当时没有发生真正的电话...
也许您可以使用其他流类型而不是语音呼叫类型,但我只是根据使用可以使用扬声器或耳机进行音频播放的应用程序的经验来说话,需要使用语音呼叫流。
就像我说的,音频处理并不是特别有趣......;)
答案 1 :(得分:6)
已经2年了。但我希望这可以帮助某人:
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
注意:如果您拨打setStreamMute(int, boolean)来静音 n 次,则必须再次将其称为 n 次以取消静音(使用false
)。
答案 2 :(得分:2)
适当的方法是使用AudioManager.requestAudioFocus(...)
方法
答案 3 :(得分:0)
您可以尝试AudioManager.adjustVolume方法:
AudioManager audioMan =
(AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);