4

我的 Android 应用程序需要支持 Android 平台 2.1.x(即 Android API 级别 7)。我需要使用requestAudioFocus()abandonAudioFocus()方法在我的应用程序开始播放媒体时暂停其他应用程序(例如音乐)播放,并在我的应用程序停止后恢复它们。

但是,这两个函数仅在 API 级别 8 及以上可用。API 级别 7 的等效函数是什么?或者在 API 级别 8 之前如何做到这一点?

4

1 回答 1

1

感谢克里斯托弗(http://stackoverflow.com/questions/1993471/android-can-i-mute-currently-playing-audio-applications),我引用:

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

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

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

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

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

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

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

于 2012-10-08T13:56:42.833 回答