获取主被叫用户信息(V2)

更新时间: 2023/08/08 11:12:51

在报表统计等场景中,您可能需要上报主被叫的一些用户信息。本文介绍获取主被叫的用户 ID(uid)、房间 ID (cid)、房间名称(cname)等信息。

背景信息

  • 本文中的内容适用于呼叫组件 V2.0.0 及以上版本。如果您使用 V1.8 版本,请参见获取主被叫用户信息(V1)
  • 集成 Android 呼叫组件时,分为含 UI 集成和不含 UI 集成,您可以根据您的使用方式,查看对应的内容。如果您没有使用呼叫组件自带的 UI,请参考本文中不含 UI 集成的场景的相关内容。
  • 不含 UI 集成时,只需要引入 api 'com.netease.yunxin.kit.call:call:2.1.0'。含 UI 集成时需要引入 api 'com.netease.yunxin.kit.call:call-ui:2.1.0'
  • 含 UI 集成的使用入口类为 CallKitUI ,不含 UI 集成的使用入口类为 NECallEngine

含 UI 集成的场景

呼叫时透传扩展信息给被叫

您可以在发起呼叫时设置扩展信息,例如用户昵称等。

  1. 发起呼叫时设置扩展信息。

    javaCallParam param = new CallParam.Builder()
    	......
      .callExtraInfo("呼叫时传入给被叫的扩展信息")
      .build();
    CallKitUI.startSingleCall(this, param);
    
  2. (可选)自定义 UI 场景中,若页面的 Activity(继承 CommonCallActivity 或其子类)启动方为主叫,则需要用户手动调用 doCall 方法发起呼叫。

    自定义 UI 场景需要执行此步骤,否则不需要。

    javadoCall(new NEResultObserver<CommonResult<NECallInfo>>() {
      @Override
      public void onResult(CommonResult<NECallInfo> result) {
         if (result.isSuccessful()){
          // 注意此时没有接听成功,其中存在字段不全,在 onCallConnected 回调中可获取较全信息
          NECallInfo callInfo = result.data;
        }
      }
    });
    
  3. 被叫用户获取透传的扩展信息。

    被叫用户在启动的被叫页面 Activity(继承 CommonCallActivity 或其子类) 中通过如下方式获取主叫透传的扩展信息。

    javapublic class TestActivity extends P2PCallFragmentActivity {
      @Override
      public void doOnCreate(@Nullable Bundle savedInstanceState) {
        super.doOnCreate(savedInstanceState);
        boolean isCaller = !getCallParam().isCalled(); // 判断是否为主叫
        String info = getCallParam().getCallExtraInfo(); // 主叫透传给被叫的数据
      }
    }
    

在呼叫的 UI 页面传递扩展信息(类似 Intent)

在含 UI 集成场景中,通过 CallKitUI 启动呼叫页面时,您可以将呼叫的扩展信息发给本地对应的页面 Activity,但是不需要给被叫。可参考如下方式实现:

  1. 设置将扩展信息透传给本地对应的呼叫 Activity。

    javaCallParam param = new CallParam.Builder()
      .....
      .addExtras("key", "实现 Serializable 或 Parcelable 接口对象")
      .build();
    CallKitUI.startSingleCall(this, param);
    
  2. UI 层获取扩展信息。

    javapublic class TestActivity extends P2PCallFragmentActivity {
      @Override
      public void doOnCreate(@Nullable Bundle savedInstanceState) {
        super.doOnCreate(savedInstanceState);
        boolean isCaller = !getCallParam().isCalled(); // 判断是否为主叫
        Object obj = getCallParam().getExtras().get("key");
      }
    }
    

通话中获取 RTC 用户 ID(rtcUid)

  1. (可选)在初始化呼叫组件时,设置当前用户的 RTC 用户 ID(rtcUid)。如果不设置,则使用随机分配的 rtcUid。

    javaCallKitUIOptions options = new CallKitUIOptions.Builder()
      .currentUserRtcUId(1000L) // 示例
      .build();
    CallKitUI.init(getApplicationContext(), options);
    
  2. 呼叫成功后,在通话中获取对端用户的 rtcUid。

    根据 IM 的 accid 获取对应的 rtcUid。

    javaNECallEngine.sharedInstance().getCallInfo().getUidByAccId("用户的云信 IM accid")
    

通话中获取信令房间的 channelId、RTC 房间的 cid 和 cname

  • 获取 RTC 房间名称

    RTC 房间的 cname 在发起呼叫时自行设置,但是需要保证唯一性。参数的格式要求请参见 RTC 的channelName格式说明

    javaCallParam param = new CallParam.Builder()
      ......
      .rtcChannelName("自定义 cname") // 自定义的 Rtc cname 房间名称
      .build();
    CallKitUI.startSingleCall(this, param);
    
  • 主叫用户获取信令房间的 channelId

    javadoCall(new NEResultObserver<CommonResult<NECallInfo>>() {
      @Override
      public void onResult(CommonResult<NECallInfo> result) {
        if (result.isSuccessful()){
          // 呼叫成功后获取信令 channelId
          String channelId = result.data.signalInfo.channelId;
        }
      }
    });
    
  • 主叫和被叫用户获取信令房间 channelId、RTC 房间的 cid 和 cname

    主叫和被叫用户在启动的通话页面 Activity(继承 CommonCallActivity 或其子类) 中,通过onCallConnected回调获当前通话的详细信息。

    javapublic class TestActivity extends P2PCallFragmentActivity {
        @Override
      public void onCallConnected(@NonNull NECallInfo info) {
        // info 当前通话的详细信息,详细内容见下方 NECallInfo 说明
      }
    }
    

不含 UI 集成的场景

呼叫时透传扩展信息给被叫

您可以在发起呼叫时设置扩展信息,例如用户昵称等。

  1. 发起呼叫时设置扩展信息。

    java// 构建呼叫参数
    NECallParam param = new NECallParam.Builder("被叫用户accId")
      .callType(NECallType.VIDEO) // 呼叫类型为视频通话
      .extraInfo("呼叫时传入给被叫的扩展信息") // 呼叫时传入给被叫的扩展信息,例如用户昵称等
      .build();
    // 发起呼叫
    NECallEngine.sharedInstance().call(param, new NEResultObserver<CommonResult<NECallInfo>>() {
      @Override
      public void onResult(CommonResult<NECallInfo> result) {
        if (result.isSuccessful()){
          // 注意此时没有接听成功,其中 callInfo 字段不全
          NECallInfo callInfo = result.data;
        }
      }
    });
    
  2. 被叫用户获取相应的扩展信息。

    被叫用户在收到来电通知时,通过 NECallEngineDelegate#onReceiveInvited 回调中的 NEInviteInfo 参数获取主叫方透传的扩展信息。

    javaNECallEngine.sharedInstance().addCallDelegate(new NECallEngineDelegateAbs() {
      @Override
      public void onReceiveInvited(NEInviteInfo info) {
        String extraInfo = info.extraInfo; // 主叫方的透传数据
      }
    });
    

获取 RTC 用户 ID(rtcUid)

  1. (可选)在初始化呼叫组件时,设置当前用户的 RTC 用户 ID(rtcUid)。如果不设置,则使用随机分配的 rtcUid。

    javaNESetupConfig setupConfig = new NESetupConfig.Builder("AppKey","currentUserAccId")
      .currentUserRtcUid(10000L) // 示例,设置当前用户的 rtcUid
      .build();
    NECallEngine.sharedInstance().setup(this, setupConfig);
    
  2. 呼叫成功后,在通话中获取对端用户的 rtcUid。

    根据 IM 的 accid 获取对应的 rtcUid。

    javaNECallEngine.sharedInstance().getCallInfo().getUidByAccId("用户的云信 IM accid")
    

获取信令房间的 channelId、RTC 房间的 cid 和 cname

  1. 在发起呼叫时传入相关参数。

    RTC 房间的 cname 在发起呼叫时自行设置,但是需要保证唯一性。参数的格式要求请参见 RTC 的channelName格式说明

    java// 构建呼叫参数
    NECallParam param = new NECallParam.Builder("被叫用户accId")
      .callType(NECallType.VIDEO) // 呼叫类型为视频通话
      .extraInfo("呼叫时传入给被叫的扩展信息") // 呼叫时传入给被叫的扩展信息
      .rtcChannelName("自定义 Rtc 房间名称") // 自定义的 Rtc 房间名称
      .build();
    // 发起呼叫
    NECallEngine.sharedInstance().call(param, new NEResultObserver<CommonResult<NECallInfo>>() {
      @Override
      public void onResult(CommonResult<NECallInfo> result) {
        if (result.isSuccessful()){
          // 注意此时没有接听成功,其中存在字段不全,在 onCallConnected 回调中可获取较全信息
          NECallInfo callInfo = result.data;
        }
      }
    });
    
  2. 被叫接通后双方会触发onCallConnected 回调,您可以通过 onCallConnected 回调参数 NECallInfo获取通话中的信息。

    javaNECallEngine.sharedInstance().addCallDelegate(new NECallEngineDelegateAbs() {
      @Override
      public void onCallConnected(NECallInfo info) {
        // info.signalInfo.channelId; 加入信令房间的 id 标识;
        // info.rtcInfo.channelName; 加入 Rtc 房间的名称;
        // info.rtcInfo.channelId; 加入 Rtc 房间的 id 标识;
        // info.currentAccId; 当前用户的云信 IM accid;
        // info.currentUserUid(); 当前用户加入 Rtc 房间的 rtcUid;
        // info.otherUserInfo().uid; 对端用户加入 Rtc 房间的 rtcUid;
        // info.otherUserInfo().accId;  对端用户的云信 IM accid;
      }
    });
    

    NECallInfo 字段内容说明

    NECallInfo 详细内容如下,涵盖了通话中的所有信息内容:

    字段 类型 说明
    callId String 客户端本地生成的唯一通话标识
    currentAccId String 当前用户登录 IM 传入到呼叫组件中的 accId
    callerInfo NEUserInfo 主叫用户信息内容,详情见下表
    calleeInfo NEUserInfo 被叫用户信息内容,详情见下表
    callType Integer 通话类型音频/视频
    • NECallType.AUDIO: 音频通话
    • NECalTypel.VIDEO:视频通话
    signalInfo NESignalInfo 通话中的信令信息内容,详情见下表
    rtcInfo NERtcInfo 通话中的Rtc信息内容,详情见下表
    callStatus Integer 当前通话状态,详细见CallState说明

    NEUserInfo 通话中的用户信息内容:

    字段 类型 说明
    accId String 用户传入到组件中的 accId
    uid String 用户当前的 rtcUid

    NESignalInfo 通话中的信令信息内容:

    字段 类型 说明
    channelId String 信令通道的唯一标识由服务端分配
    requestId String 发起呼叫时的唯一标识
    channelName String 信令房间的名称
    extraInfo String 呼叫方发起呼叫传入的扩展信息
    globalExtraCopy String 定义的呼叫全局抄送信息,用户服务端接收抄送时设置自己的业务字段

    NERtcInfo 通话中的Rtc信息内容:

    字段 类型 说明
    channelId String RTC 房间的 channelId 唯一标识,由 RTC 服务端分配
    channelName String RTC 房间的名称,需要唯一
    token String 加入 RTC 房间的 Token 信息
此文档是否对你有帮助?
有帮助
去反馈
  • 背景信息
  • 含 UI 集成的场景
  • 呼叫时透传扩展信息给被叫
  • 在呼叫的 UI 页面传递扩展信息(类似 Intent)
  • 通话中获取 RTC 用户 ID(rtcUid)
  • 通话中获取信令房间的 channelId、RTC 房间的 cid 和 cname
  • 不含 UI 集成的场景
  • 呼叫时透传扩展信息给被叫
  • 获取 RTC 用户 ID(rtcUid)
  • 获取信令房间的 channelId、RTC 房间的 cid 和 cname
  • NECallInfo 字段内容说明