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

Android的AudioManager.getMode()似乎不可靠。同样的情况产生不同的结果,android,android-audiomanager,Android,Android Audiomanager,我目前正在开发一款音频播放器,该播放器在失去音频焦点时应该暂停/停止,例如当来电时 虽然我通过使用OnAudioFocusChangeListener可以很好地实现这一点,但我希望增强此功能,使其在不同情况下表现不同 由于应用程序实现了一个超时功能,以防用户在收听时睡着,因此我只想在确定用户仍然醒着时恢复播放 我想我几乎可以忽略通知的声音,就像收到电子邮件的声音一样,因为这些通常只是短片段,我继续播放的音频不会像打电话时那样对用户造成滋扰。 因此,我想将暂停/停止限制在接到电话或用户拨打电话的情

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

虽然我通过使用OnAudioFocusChangeListener可以很好地实现这一点,但我希望增强此功能,使其在不同情况下表现不同

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

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

我已经看到AudioManager有一些方便的状态来表示这一点,但是在OnAudioFocusChangeListener中调用AudioManager.getMode时,我没有得到一致的输出。 有时,来电确实会产生MODE_铃声,但通常足以使功能不可靠,我会使MODE_正常

事实上,我可以忍受在失去焦点时不知道模式,只要我在重新获得焦点时得到正确的模式,但这似乎并不可靠

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

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

phone rings->AudioManager.getMode应在焦点丢失时返回MODE_铃声 用户拨打或接听电话->AudioManager.getMode应在焦点丢失时返回模式\u 不接听电话->AudioManager.getMode应在焦点增益时返回MODE_铃声 用户挂断->AudioManager.getMode应在调焦增益时返回调焦模式 这就是它的工作方式吗?至少我的测试表明这是应该的方式,但由于某些原因并非总是如此

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


最后,我想问一下,我对AudioManager.getMode的理解是否正确,是否有关于其可靠性的任何信息,对我来说,我从中得到的结果是无用的。

找到了一种检查手机状态的方法,显然不需要读取手机状态许可。我更新了OnAudioFocusChangeListener以调用TelephonyManager.getCallState。我想,因为这不允许我访问电话号码,所以不需要许可。此外,我不需要PhoneStateListener和OnAudioFocusChangeListener,当请求音频焦点时,我仍然需要它们。上述解决方案不会在通话结束后恢复播放,因为最后一个状态是铃声,如果用户不接听电话,应用程序也不会恢复播放。为了说明这一点,该应用程序应该用于收听有声读物,并提供睡眠超时功能。当用户没有接听电话时,应用程序应假定用户处于睡眠状态,从而停止播放。找到了一种检查手机状态的方法,该方法显然不需要READ\u phone\u state权限。我更新了OnAudioFocusChangeListener以调用TelephonyManager.getCallState。我想,因为这不允许我访问电话号码,所以不需要许可。此外,我不需要PhoneStateListener和OnAudioFocusChangeListener,当请求音频焦点时,我仍然需要它们。上述解决方案不会在通话结束后恢复播放,因为最后一个状态是铃声,如果用户不接听电话,应用程序也不会恢复播放。为了说明这一点,该应用程序应该用于收听有声读物,并提供睡眠超时功能。当用户没有接听电话时,应用程序假定用户睡着了,因此停止播放。