Android 电信管理器:新增VOIP通话没有声音
我正在尝试在我的应用中添加VOIP视频通话。我已经注册了电话账户并将通话添加到TelecomManager。通话已成功接受。我已经实现了Connection和ConnectionService。
我正在使用以下代码添加通话:
var uri = Android.Net.Uri.FromParts(PhoneAccount.SchemeSip, voipCallInfo.Payload?.CallerName, null);
extras.PutParcelable(TelecomManager.ExtraIncomingCallAddress, uri);
extras.PutParcelable(TelecomManager.ExtraPhoneAccountHandle, phoneAccountHandle);
telecomManager.AddNewIncomingCall(phoneAccountHandle, extras);
我正在使用以下代码来接听响铃电话。
var telecomManager = GetTelecomManager();
if (telecomManager == null)
{
logger.Error("Telecom Manager is null, May be permissions not granted");
return;
}
try
{
.
.
.
telecomManager.AcceptRingingCall();
.
.
}
catch (Exception ex)
{
logger.Error("RequestSystemToAnswerCall Exception : " + ex.Message);
}
我已尝试请求音频焦点,但当我在电信管理器中添加呼叫时,我的应用程序会失去焦点,因为手机开始响铃。在接听电话后,应用程序无法重新获得焦点,我相信电信/通话具有焦点,但我什么都听不见。通话中的另一个人可以毫无问题地听到我。当我结束通话后,应用程序会重新获得焦点。
我在日志中可以看到以下内容。
2020-06-22,14:09:34.831 WebRTCManager Trace IsAudioSubscriptionEnabled True
[AudioManager] Use of stream types is deprecated for operations other than volume control
[AudioManager] See the documentation of requestAudioFocus() for what to use instead with android.media.AudioAttributes to qualify your playback use case
[AUDIO_FOCUS] Audio Focus request DENIED !
以下是我用于请求音频的代码。
public bool RequestAudioFocus()
{
var amanager = (AudioManager)GetSystemService(AudioService);
AudioFocusRequest audioFocusRequest;
if (Build.VERSION.SdkInt > BuildVersionCodes.O)
{
audioFocusRequest = amanager.RequestAudioFocus(new AudioFocusRequestClass.Builder(AudioFocus.Gain)
.SetAudioAttributes(new AudioAttributes.Builder().SetLegacyStreamType(Stream.VoiceCall).Build())
.SetOnAudioFocusChangeListener(this)
.Build());
}
else
{
audioFocusRequest = amanager.RequestAudioFocus(this, Stream.VoiceCall, AudioFocus.Gain);
}
Debug.WriteLine("MainActivity RequestAudioFocus audioFocusRequest : " + audioFocusRequest);
if (audioFocusRequest == AudioFocusRequest.Granted)
{
return true;
}
return false;
}
如果我不使用TelecomManager建立VOIP连接,一切都正常。所以我相信当我添加和接受电话时出了问题。
感谢任何想法或修复。
AudioFocusRequest
,在您的情况下,使用语音通信AudioAttribute
与请求是合适的。我浏览了一下opentok代码,没有看到他们在任何地方为您请求音频焦点。因此,在添加呼叫之前,您可能需要自己请求它。您还可以使用此功能通过监听器中的音频焦点更改来检测您的应用程序是否真正失去了音频焦点。 - Cheesebaron