在相同的添加呼叫中,AudioFocus 请求 OpenTok(Tokbox) 被拒绝,android 9 和 10
AudioFocus request DENIED to OpenTok(Tokbox) when in same added Call, android 9 and 10
Android 电信管理器在添加的 VOIP 呼叫中没有来电 audio/sound
我正在尝试在我的应用程序中添加 VOIP 视频通话。我已经注册了 phone 帐户并将呼叫添加到 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);
}
我曾尝试请求音频焦点,但是当我在电信管理器中添加呼叫时,我的应用程序失去了焦点,因为 phone 开始响铃。在我接听电话后应用程序没有重新获得焦点我相信 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 连接时。一切正常。所以我相信当我添加并接听电话时出了点问题。
感谢任何想法或修复。
您应该使用AudioManager.AUDIOFOCUS_GAIN
或AudioManager.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 docs.
之所以听不到任何声音,是因为OpenTok服从了RequestAudioFocus的结果。由于音频焦点请求失败,OpenTok 将不会播放音频。您可以找出 RequestAudioFocus 失败的原因或下载到 Xamarin.OpenTok.Android 2.14.2 以便即使 RequestAudioFocus 失败也能播放音频。
我也遇到了同样的问题。这是一个可能不是 'right' 方法的修复程序,但对我有用。在我的 VOIP 呼叫 activity 中,一旦建立了 VOIP 连接,我就会用以下命令终止我的连接对象:
mCallConnection.onDisconnect();
mCallConnection.destroy();
并且 OpenTok 重新获得了音频焦点。传入的音频作品。我还不知道提前杀死 Connection 对象的潜在后果(无法执行其他呼叫功能,如保持、与其他来电交互等)。但在我找到另一种方法让 Connection 放弃其音频焦点之前,我将不得不这样做。
Android 电信管理器在添加的 VOIP 呼叫中没有来电 audio/sound
我正在尝试在我的应用程序中添加 VOIP 视频通话。我已经注册了 phone 帐户并将呼叫添加到 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);
}
我曾尝试请求音频焦点,但是当我在电信管理器中添加呼叫时,我的应用程序失去了焦点,因为 phone 开始响铃。在我接听电话后应用程序没有重新获得焦点我相信 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 连接时。一切正常。所以我相信当我添加并接听电话时出了点问题。
感谢任何想法或修复。
您应该使用AudioManager.AUDIOFOCUS_GAIN
或AudioManager.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 docs.
之所以听不到任何声音,是因为OpenTok服从了RequestAudioFocus的结果。由于音频焦点请求失败,OpenTok 将不会播放音频。您可以找出 RequestAudioFocus 失败的原因或下载到 Xamarin.OpenTok.Android 2.14.2 以便即使 RequestAudioFocus 失败也能播放音频。
我也遇到了同样的问题。这是一个可能不是 'right' 方法的修复程序,但对我有用。在我的 VOIP 呼叫 activity 中,一旦建立了 VOIP 连接,我就会用以下命令终止我的连接对象:
mCallConnection.onDisconnect();
mCallConnection.destroy();
并且 OpenTok 重新获得了音频焦点。传入的音频作品。我还不知道提前杀死 Connection 对象的潜在后果(无法执行其他呼叫功能,如保持、与其他来电交互等)。但在我找到另一种方法让 Connection 放弃其音频焦点之前,我将不得不这样做。