Android的AudioManager.getMode()似乎不可靠。相同的情况产生不同的结果

时间:2012-02-10 20:48:26

标签: android android-audiomanager

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

虽然我通过使用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()应该在焦点增益
  4. 上返回MODE_RINGTONE
  5. 用户挂机 - > AudioManager.getMode()应该在焦点增益上返回MODE_IN_CALL
  6. 这是应该的方式吗?至少我的测试表明这是应该的方式,但由于某种原因不是所有的时间。

    我试图解决此问题的另一种方法是使用PhoneStateListener,但我遇到的问题是这需要我的应用程序请求读取手机状态的权限。在我分享我的应用程序时,目前通过SourceForge,后来可能通过Android Market,我想避免使用这种权限。

    所以,即将结束,我想问一下我理解AudioManager.getMode()的方式是否正确,如果有任何关于其可靠性的信息,那么我得到的结果是有点无用的。 / p>

0 个答案:

没有答案