8

Android Telecom Manager 在添加的 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);
}

我试图请求音频焦点,但是当我在电信管理器中添加呼叫时,我的应用程序失去焦点,因为电话开始响铃。在我接受呼叫应用程序后,我相信 Telecom/Call 有焦点,但我什么也听不到。通话中的其他人可以毫无问题地听到我的声音。当我结束通话时,应用程序会重新获得焦点。

我可以在日志中看到下面的内容。

    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 连接时。一切正常。所以我相信当我添加并接听电话时会出现问题。

感谢您的任何想法或修复。

4

3 回答 3

1

之所以听不到任何声音,是因为 OpenTok 服从了 RequestAudioFocus 的结果。由于音频焦点请求失败,OpenTok 将不会播放音频。您可以找出 RequestAudioFocus 失败的原因或下载到 Xamarin.OpenTok.Android 2.14.2 以便即使 RequestAudioFocus 失败也能播放音频。

于 2020-06-26T09:19:41.863 回答
0

您应该使用AudioManager.AUDIOFOCUS_GAINorAudioManager.AUDIOFOCUS_GAIN_TRANSIENT来请求音频焦点。在这里,您将在收到呼叫时请求未定义的时间量,因此AudioManager.AUDIOFOCUS_GAIN_TRANSIENT强烈建议使用音频焦点请求。这是代码片段。

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
AudioAttributes mAudioAttributes =
       new AudioAttributes.Builder()
               .setUsage(AudioAttributes.USAGE_MEDIA)
               .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
               .build();
AudioFocusRequest mAudioFocusRequest =
       new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
               .setAudioAttributes(mAudioAttributes)
               .setAcceptsDelayedFocusGain(true)
               .setOnAudioFocusChangeListener(...) // Need to implement listener
               .build();
int focusRequest = mAudioManager.requestAudioFocus(mAudioFocusRequest);
switch (focusRequest) {
   case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
       // don’t start playback
   case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
       // actually start playback
}

通过设置监听回调函数setOnAudioFocusChangeListener可以监听音频焦点的变化。

在 Android N 和更早版本上,您可以在不使用对象的情况下声明此意图AudioFocusRequest,如下所示。您仍然必须实施AudioManager.OnAudioFocusChangeListener以对状态变化做出反应。这是上面代码片段的等效代码。

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
int focusRequest = mAudioManager.requestAudioFocus(
..., // Need to implement listener
       AudioManager.STREAM_MUSIC,
       AudioManager.AUDIOFOCUS_GAIN);
switch (focusRequest) {
   case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
       // don't start
   case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
       // start
}

最后一句话,当你的应用程序完成播放它的音频时,它应该通过调用来放弃音频焦点AudioManager.abandonAudioFocus(…)

对于您给定的代码,如果 OpenTok 不处理音频焦点,您必须在AcceptRingingCall()方法调用之前请求音频焦点。您可以关注官方的 android文档

于 2020-06-25T22:56:42.333 回答
0

我也有同样的问题。这是一个可能不是“正确”的修复方法,但对我有用。在我的 VOIP 通话活动中,一旦 VOIP 连接建立,我会使用以下命令终止我的 Connection 对象:

mCallConnection.onDisconnect();
mCallConnection.destroy();

OpenTok 重新获得了音频焦点。传入的音频作品。我还不知道提前终止 Connection 对象的潜在后果(无法执行其他呼叫功能,如保持、与其他来电交互等)。但在我找到让 Connection 放弃其音频焦点的另一种方法之前,我将不得不这样做。

于 2020-09-17T03:02:16.167 回答