常见问题
更新时间: 2024/09/23 16:58:29
本文介绍网易云信呼叫组件 Android 端的常见问题及解决方法。
在挂断时,离开 RTC 房间和 close 信令频道哪个先执行?
呼叫组件在挂断时,先执行关闭(close
)信令。
不能正常入会如何解决?
问题描述
同时引入呼叫组件以及 网易云信音视频通话 SDK(NERTC SDK),不能正常入会,应如何处理?
解决方法
请参考如下步骤进行排查和处理:
-
确保呼叫组件为 1.3.3 版本以上,如果低于该版本,请升级至最新版本。
-
确认其他工程为全局初始化一次 NERTC SDK,还是每次使用的时候初始化,使用完成后释放。
目前组件默认为全局初始化一次,组件释放时释放 SDK 实例。如果其他工程初始化和组件初始化逻辑不同,会产生冲突,导致入会失败。请通过设置
rtcInitScope(false)
解决。若每次通话开始初始化,通话结束释放实例,会增加用户接听首帧时长,且呼叫的本地预览无法支持。
多端登录时,接听失败
问题描述
用户 A 多端登录,用户 B 呼叫用户 A,用户 A 多设备均可收到呼叫邀请,但是当其中一端用户单击接听时,出现无法接听或接听失败,此时应如何处理?
解决方法
当前设计方案为被叫收到呼叫邀请时,首先加入信令 channel,但是同一个用户限制只能加入一次信令 channel,这就导致多端设备收到呼叫时,其中一端加入 channel 失败,此时加入 channel 失败方单击接听会出现问题。若有多端登录的需求可以按照如下配置:
呼叫时展示的昵称错误
呼叫组件展示的昵称均通过网易云信 IM SDK 下述方法获取:
JavaNIMClient.getService(UserService::class.java).getUserInfo("AccId").getName()。
若用户需要展示昵称,可以使用下述方法更新目标用户昵称:
JavaHashMap<UserInfoFieldEnum, Object> fields = new HashMap<>();
fields.put(UserInfoFieldEnum.Name,"userName");
NIMClient.getService(UserService.class).updateUserInfo(fields);
为什么应用集成呼叫组件后,应用退出后收不到推送消息?
目前呼叫组件的离线推送功能公用 IM SDK 的推送,具体请参考 接入 IM Sdk 的推送功能。
推送接入成功后,若用户需要修改被叫离线收到的呼叫推送消息内容,可以使用 pushConfigProvider
完成修改,示例代码如下:
Java CallKitUIOptions options = new CallKitUIOptions.Builder()
......
.pushConfigProvider(new PushConfigProvider() {
@Override
public SignallingPushConfig providePushConfig(InvitedInfo info) {
// true - 需要推送,false 不推送
// pushTitle - 推送标题
// pushContnet - 推送内容
return new SignallingPushConfig(true, pushTitle, pushContent);
}
})
......
.build();
CallKitUI.init(context,options);
集成组件后出现编译错误问题 expected reference but got (raw string) code example
请在应用的主工程 styles.xml
文件中添加如下代码:
XML <style name="BottomDialogTheme" parent="ThemeOverlay.AppCompat.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowIsTranslucent">false</item>
</style>
为什么应用集成呼叫组件后,应用退到后台不会响铃?
问题原因
响铃依赖弹出的呼叫界面,如果应用没有配置后台弹出界面,后台收到呼叫时,无法弹出对应的呼叫界面,所以无法实现响铃。
解决方法
您可以通过如下两种方案解决该问题:
- 通过呼叫组件的
notificationConfigFetcher
配置后台消息提醒的通知栏铃声,具体请参考 初始化参数配置。 - 在呼叫组件的
incomingCallEx
自行实现接听逻辑,判断应用如果在后台的情况下,调用系统的接口播放铃声。另外,您还需要自行实现前台弹出界面的逻辑,可以直接继承呼叫组件DefaultIncomingCallEx
中的onIncomingCall
方法。
呼叫挂断后,会自动销毁 NERTC 实例吗?
默认不销毁 NERTC 实例。您可以在初始化呼叫组件时,通过 initRtcMode
参数设置 NERTC 是否随呼叫组件进行初始化和销毁,默认为 NECallInitRtcMode.GLOBAL
。
当 initRtcMode
参数设置为 NECallInitRtcMode.IN_NEED
,呼叫组件发起呼叫或被叫收到来电时,会自动初始化 NERTC 实例,呼叫组件挂断时,销毁 NERTC 实例。具体配置如下:
如果是 V1.8.2 及之前版本,请通过 rtcInitScope
参数设置 NERTC 是否随呼叫组件进行初始化和销毁。
-
示例代码(V2.0.0 及之后版本)
Java
CallKitUIOptions options = new CallKitUIOptions.Builder() ...... // NECallInitRtcMode.GLOBAL:全局初始化 NERTC 一次,通话结束不会销毁 NERTC 实例,默认值 // NECallInitRtcMode.IN_NEED:主叫在呼叫时初始化 rtc,被叫在收到呼叫时初始化 rtc,通话结束销毁 rtc .initRtcMode(NECallInitRtcMode.GLOBAL) .build(); CallKitUI.init(getContext(), options);
-
示例代码(V1.8.2 及之前版本)
Java
CallKitUIOptions options = new CallKitUIOptions.Builder() ...... // true:全局初始化 NERTC 一次,通话结束不会销毁 NERTC 实例,默认值 // false:主叫在呼叫时初始化 rtc,被叫在收到呼叫时初始化 rtc,通话结束销毁 rtc .rtcInitScope(true) .build(); CallKitUI.init(getContext(),options);
呼叫挂断后,为什么没有离开 RTC 房间?
问题现象
通过不含 UI 方式集成呼叫组件,呼叫挂断后,用户没有离开 RTC 房间。
问题原因
挂断时传入的 channelId 不正确,需要传入信令的 channelId,不是加入 RTC 的 channelId。
解决方法
在 call 的结果回调中,您可以获取信令的 channelId 和 RTC 的 channelId,两者不是同一个值,请传入信令的 channelId。具体获取方法请参考 获取主被叫用户信息。
V2 版本呼叫组件 NEHangupReasonCode 说明
NEHangupReasonCode
枚举了呼叫组件的通话终止错误码。详情请参考 不含 UI 集成(V2) 呼叫结束错误码(NEHangupReasonCode
)章节。
以其中的错误码 10(SELF_RTC_DISCONNECTED
,呼叫的用户为本端 RTC 用户)和 19(USER_RTC_DISCONNECTED
,本端用户 RTC 房间长链接断开)为例:
-
通过调用音视频通话的服务端 API 删除呼叫组件音视频房间或者踢出某个房间里面的用户时,被踢的用户在组件层面会触发
onCallEnd
的回调,回调返回的通话终止的错误码是10
。 -
被踢的另一端可能收到的错误码是 19,也有可能是 10。这是因为:
-
被踢的人触发
onCallEnd
:10 的同时,会通过信令发送给对方被踢了的事件,对方收到了就会回调错误码 10。 -
但是对端的用户 RTC SDK 也会回调
onUserLeave
的回调,这个时候对端就会回调onCallEnd:19
的错误码。如果 RTC 回调更快,另一端回调是 19。如果是信令回调更快,则对端回调 10,建议是两个错误都做对应的提示处理。如下图所示:
sequenceDiagram actor A as 用户 A actor B as 用户 B participant RTC 服务端 as RTC 服务端 participant 呼叫组件 A->>B:通话中 RTC 服务端 ->>A:中止通话 呼叫组件->>A: 触发 onCallEnd 回调 呼叫组件->>A: 错误码:10<br>错误信息:SELF_RTC_DISCONNECTED par 信令回调 信令->>B: 发送用户 A 被踢的事件 呼叫组件->>B: 错误码:10<br>错误信息:SELF_RTC_DISCONNECTED end par RTC 回调 RTC 服务端->>B: 触发 onUserLeave 回调 呼叫组件->>B: 错误码:19<br>错误信息:USER_RTC_DISCONNECTED end
-
如果是从 IM 层面被踢的情况下,回调的错误码是 8(KICKED
,用户被踢出)。
- V1 版本呼叫组件的用户被踢,可通过
onDisconnect
回调监听,建议升级到 V2 版本呼叫组件。 - V1 版本呼叫组件自己挂断不会触发
onCallEnd
接口,V2 版本呼叫组件自己挂断会触发onCallEnd
,在onCallEnd
的错误码里面说明具体挂断的原因。
发起音视频通话,为什么提示未初始化?
问题描述
呼叫组件发起音视频通话时提示未初始化(callkit has not init
)。
问题原因
呼叫组件正常启动流程为:Application -> SplashActivity -> HomeActivity。
当您处在 HomeActivity 页面时将应用退回至后台,呼叫组件在回收重启时会跳过 SplashActivity 页面,直接打开 HomeActivity。
而呼叫组件的初始化需要在 SplashActivity 页面中完成,因此上述场景会跳过呼叫组件的初始化。
1v1 音视频通话 Demo 不会出现上述问题,因为 1V1 的实现代码中,使用 AppStatusManager 类来检测和处理应用的前后台状态变化,如果发生回收,即重启应用。
解决方法
-
方案一:在关键页面中,检查呼叫组件的状态,如果发现呼叫组件没有初始化,及时进行初始化。
-
方案二:参考 1v1 音视频通话场景的 Demo 实现,如果发生回收,即重启应用。