常见问题

更新时间: 2023/11/29 03:29:11

本文介绍呼叫组件 Android 端的常见问题及解决方案。

在挂断时,离开 RTC 房间和 close 信令频道哪个先执行?

呼叫组件在挂断时,先执行close信令。

如何获取呼叫组件的日志?

  • V1.8.2及以上版本

    若呼叫组件版本为 V2.0.0 及以上版本,日志的获取方式如下:

    请实现 XKitInitOptions 接口,并在 proguard-rules.pro 中添加相应的防代码混淆策略,以避免代码被混淆。

    1. AndroidManifest 文件中注册如下代码。
    <meta-data
        android:name="ExampleOptions 全类名" // 例如 "com.netease.test.ExampleOptions"
        android:value="com.netease.yunxin.xkit.options"
        />
    
    1. 设置呼叫组件日志路径的示例代码如下:
    @Keep
    
    public class ExampleOptions implements XKitInitOptions {
      @Nullable
      @Override
      public XKitLog0ptions_log0ption(@NonNull Context context) {
        return new XKitLogOptions.Builder()
          .path("目标路径")
          .build();
      }
    }
    
  • V1.3.3~ V1.8版本

    若 App 依赖的 IM SDK 版本 为8.5.5 及以上,呼叫组件版本为 V1.3.3及以上版本,日志的获取方式如下:

    • 如果 IM 的日志路径为默认的日志路径:请提供目标账号的 accId 以及 AppKey,联系网易云信技术支持工程师从后台拉取相应的日志。
    • 如果 IM 的日志路径为自定义的日志路径:请将呼叫组件的日志路径修改为和 IM 的日志路径相同。

  • V1.3.3 以下版本

若使用的呼叫组件版本为 V1.3.3 以下,呼叫组件的日志路径如下:

/sdcard/android/data/应用包名/files/ne_log

不能正常入会如何解决?

Q:同时引入呼叫组件以及NERtc SDK,不能正常入会,应如何处理?

A:请参考如下步骤进行排查和处理:

  1. 确保呼叫组件为 1.3.3 版本以上,如果低于该版本,请升级至最新版本。

  2. 确认其他工程为全局初始化一次 NERtc SDK,还是每次使用的时候初始化,使用完成后释放。

    目前组件默认为全局初始化一次,组件释放时释放 SDK 实例。如果其他工程初始化和组件初始化逻辑不同,会产生冲突,导致入会失败。请通过设置 rtcInitScope(false) 解决。

呼叫组件释放逻辑

若每次通话开始初始化,通话结束释放实例,会增加用户接听首帧时长,且呼叫的本地预览无法支持。

多端登录时,接听失败

Q:用户 A 多端登录,用户 B 呼叫用户 A,用户 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 文件中添加如下代码:

java <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及之后版本)
javaCallKitUIOptions 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及之前版本)
javaCallKitUIOptions 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 说明

通过调用音视频通话的服务端 API 删除呼叫组件音视频房间或者踢出某个房间里面的用户时,被踢的用户组件层面会触发 onCallEnd 的回调,回调返回的通话终止的错误码是 10,SELF_RTC_DISCONNECTED。被踢的另一端可能收到的错误码是 19,也有可能是10。这是因为被踢的人触发 onCallEnd:10的同时,会通过信令发送给对方被踢了的事件,对方收到了就会回调错误码10,但是对端的用户 RTC SDK也会回调 onUserLeave 的回调,这个时候对端就会回调 onCallEnd:19 的错误码。所以 RTC 回调更快,另一端回调是19,如果是信令回调更快,则对端回调10,建议是两个错误都做对应的提示处理。

例如,用户A和用户B通话,用户A被服务端API接口踢出了通话,那么用户A会触发 onCallEnd,错误码为10,用户B会也触发 onCallEnd,错误码可能是10或者19。

IM层面被踢的情况下,回调的错误码是 8,KICKED

  • V1版本的被踢,直接通过 onDisconnect 回调监听,建议升级到V2的呼叫组件版本。
  • V1版本自己挂断不会触发 onCallEnd 接口,V2版本自己挂断会触发 onCallEnd,在 onCallEnd 的错误码里面说明具体挂断的原因。
此文档是否对你有帮助?
有帮助
去反馈
  • 在挂断时,离开 RTC 房间和 close 信令频道哪个先执行?
  • 如何获取呼叫组件的日志?
  • 不能正常入会如何解决?
  • 多端登录时,接听失败
  • 呼叫时展示的昵称错误
  • 为什么应用集成呼叫组件后,应用退出后收不到推送消息?
  • 集成组件后出现编译错误问题 expected reference but got (raw string) code example
  • 为什么应用集成呼叫组件后,应用退到后台不会响铃?
  • 问题原因
  • 解决方案
  • 呼叫挂断后,会自动销毁NERTC实例吗?
  • 呼叫挂断后,为什么没有离开RTC房间?
  • 问题现象
  • 问题原因
  • 解决方案
  • V2版本呼叫组件 NEHangupReasonCode 说明