我想知道音频模式(由 AudioManager.getMode() 返回)何时更改。这样我就可以在模式不是 MODE_NORMAL 时禁用我的应用程序中的功能。显然我可以进行轮询,但这对电池不友好,而且会浪费 CPU。
来电时有一个广播 Intent ,但这不可用,因为它还会告诉您来电号码,我不希望我的应用获得这些权限。模式更改很可能是在用户切换到其他应用程序时发生的,在这种情况下,我的 Activity 会知道,但还有许多其他情况下音频模式可能会更改,而我只是不知道。
我不能使用 2.2 中的 AudioFocus 东西,因为我需要支持 1.6 以后的版本。
编辑:我想停止的那种功能包括抖动检测和各种计时器。我想在非正常音频模式下进入休眠模式,并在 MODE_NORMAL 上再次激活。
最佳答案
我建议分两阶段进行攻击。
在其支持的平台上使用 AudioFocus。这大约是 90% 的手机,因此对于大多数用户来说,这将提供最佳解决方案。您的应用没有理由不支持这两种实现,而只是在运行时提供适合底层平台的实现。
对于 1.6,我建议如下。大概您想要影响的应用程序中的功能是某种音频播放。如果您的应用正在播放音频,则轮询以查看音频模式是否发生变化所增加的电池消耗相对较小。
不播放音频时,只需要查询当前音频模式即可开始播放音频。
对于您指定的情况,监听传感器变化和运行计时器对电池的影响再次使轮询音频模式的效果相形见绌——尤其是当您希望在模式处于关闭状态时启用您的功能时普通的。
由于您只想在电话通话期间的短时间内禁用某些功能,因此最好在通话期间执行您希望禁用的任何操作之前立即查询音频模式。
所以步骤变成:
- 在播放/操作之前检查音频模式。
- 在播放期间轮询音频模式。
关于Android 音频模式更改通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9091525/