2

我目前正在开发一个音频播放器,它应该在失去音频焦点时暂停/停止,例如来电时。

虽然我通过使用 OnAudioFocusChangeListener 可以正常工作,但我想增强此功能以在不同情况下表现不同。

由于应用程序实现了超时功能,以防用户在收听时睡着了,我只想在我可以肯定用户仍然醒着时恢复播放。

我想我几乎可以忽略收到电子邮件的通知声音,因为这些通常只是短片,我的音频继续播放不会像在电话中那样对用户造成滋扰。因此,我想将暂停/停止限制为有来电或用户拨打电话的情况。

我已经看到 AudioManager 有一些方便的状态来发出信号,但是在我的 OnAudioFocusChangeListener 中调用 AudioManager.getMode() 时,我没有得到一致的输出。有时来电确实会生成 MODE_RINGTONE,但通常足以使功能不可靠,我得到 MODE_NORMAL。

只要我在重新获得焦点时获得正确的模式,我实际上可以忍受失去焦点时不知道模式的情况,但这似乎也不能可靠地工作。

我可以测试此行为的唯一实际设备是运行 Android 2.3.6 的 Galaxy S2(由于我使用 MediaMetadataRetriever,该应用程序是 API 级别 10,因此至少需要 2.3.3)。我已经在各种模拟系统中测试了音频焦点的丢失和重新获得,总体而言它似乎在那里工作得更好,但我每次也没有真正得到相同的结果。

也许问题是我误解了 AudioManager.getMode() 应该返回什么,也许有人可以为我澄清一下:

  1. 电话响铃-> AudioManager.getMode() 应该在焦点丢失时返回 MODE_RINGTONE
  2. 用户拨打或接听电话 -> AudioManager.getMode() 应在焦点丢失时返回 MODE_IN_CALL
  3. 不接听电话 -> AudioManager.getMode() 应该在焦点增益时返回 MODE_RINGTONE
  4. 用户挂断 -> AudioManager.getMode() 应该在焦点增益时返回 MODE_IN_CALL

这是它应该工作的方式吗?至少我的测试表明这是它应该的方式,但由于某种原因并非一直如此。

我尝试解决此问题的另一种方法是使用 PhoneStateListener,但我遇到的问题是这需要我的应用程序请求读取电话状态的权限。由于我正在共享我的应用程序,目前通过 SourceForge,稍后可能通过 Android Market,我想避免使用这种权限。

所以,最后我想问一下我理解 AudioManager.getMode() 的方式是否正确,是否有任何关于其可靠性的信息,至于我从中得到的结果有点没用。

4

0 回答 0