说明
在 Android10.0 之前, Android9.1, Android8.0 就已经预留了多个应用同时录音的方法, 在 Android10.0 终于系统层面默认支持上多个应用同时使用录音机了 😄, 但是经过实际测试, 发现虽然能同时使用 AudioRecord, 但是后一个应用打开后, 前一个应用就拿不到音频数据了. 那么问题来了.
代码分析
...
@AudioPolicyService.cpp
AudioPolicyService::UidPolicy::updateUid()
AudioPolicyService::UidPolicy::notifyService()
AudioPolicyService::updateUidStates()
AudioPolicyService::updateUidStates_l()
if (isVirtualSource(source)) {
allowCapture = true;
}
setAppState_l(current->uid, allowCapture ? apmStatFromAmState(mUidPolicy->getUidState(current->uid)) : APP_STATE_IDLE);
@AudioPolicyManager.cpp
AudioPolicyManager: setAppState()
// 配置 AudioInputDescriptor
mInputs.valueAt(i)->setAppState(uid, state);
@AudioInputDescriptor.cpp
AudioInputDescriptor->setAppState()
// RecordClientVector
client->setAppState(state);
从这个调用逻辑上可以看出, 现在的 Android10.0 进行了对每个应用做了录音权限策略, 当然主要是为了服务 Google Assistant 助手, 当然通过修改代码也可以支持自己的应用程序.
😄参考博客: https://www.it610.com/article/1291696911320948736.htm
修改方式
源码路径: sdk\frameworks\av\services\audiopolicy\service\AudioPolicyService.cpp
/* static */
bool AudioPolicyService::isVirtualSource(audio_source_t source)
{
switch (source) {
case AUDIO_SOURCE_VOICE_UPLINK:
case AUDIO_SOURCE_VOICE_DOWNLINK:
case AUDIO_SOURCE_VOICE_CALL:
case AUDIO_SOURCE_REMOTE_SUBMIX:
case AUDIO_SOURCE_FM_TUNER:
case AUDIO_SOURCE_VOICE_RECOGNITION: // Modify Tower 20200810
return true;
default:
break;
}
return false;
}
在 AudioPolicyService::isVirtualSource() 里面添加需要支持的 Source 就可以多个应用拿到数据了.
与之相关
Android Audio - 音频子系统框架简析
Android Audio - 支持多应用同时录音_Android4.4修改方法
Android Audio - 支持多应用同时录音_Android5.1 & Android6.0 修改方法