我的应用程序中有一个录音服务,可以连续录制声音。因此,它将始终占据AudioRecord。这意味着没有其他应用程序可以使用录音机,因为它已经被该服务占用了。有没有办法通知其他应用程序正在请求录音机(这样我就可以释放它),以及应用程序何时释放它(这样我可以将它分配回服务)?
也许一种可能的方法是创建一个BroadcastReceiver
,它从请求控制麦克风源的应用程序接收事件。onReceive()
方法应该与服务交互并释放资源。当另一个应用程序完成时,它可以恢复进程以再次启动服务。如果你不能控制请求应用程序的行为,我认为会有一个稍微不同的问题。总之:
问题在于知道何时请求资源,这可以通过AudioManager意图类型来完成。请务必查看管理音频焦点,它以瞬态方式谈论音频焦点丢失!
正如@Rekire所提到的,可能没有办法实现这一点。此外,AudioManager不提供此类广播,因此不可能用于不同的应用程序。也许根除设备是唯一的选择。
这可以通过AudioManager.OnAudioFocusChangeListener回调来完成。只需停止AUDIOFOCUS_LOSS_TRANSIENT事件的录制,然后重新开始AUDIOFOCUS_GAIN事件。此解决方案适用于谷歌语音搜索(谷歌搜索小部件、谷歌Chrome等)。
但不幸的是,它在其他普通应用程序中效果不佳(例如,HTC M7 Voice Recorder应用程序无法在第一次单击"录制"按钮时开始录制,第二次单击"完成任务"-似乎应用程序应该准备好在失败时重试录制几次)。