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

更新时间: 2023/08/08 11:13:15

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

背景信息

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

含 UI 集成的场景

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

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

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

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

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

    javadoCall(new JoinChannelCallBack() {
      @Override
      public void onJoinChannel(ChannelFullInfo channelFullInfo) {
      }
      @Override
      public void onJoinFail(String msg, int code) {
      }
    }, getCallParam().getCallExtraInfo()); // 将 UI 层数据传给 API 层
    
  3. 被叫用户获取透传的扩展信息。

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

    javapublic class TestActivity extends P2PCallActivity {
      @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 P2PCallActivity {
      @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。

javaNERTCVideoCall.sharedInstance().getRtcUidByAccId("用户的云信 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 JoinChannelCallBack() {
      @Override
      public void onJoinChannel(ChannelFullInfo channelFullInfo) {
        String signalChannelId = channelFullInfo.getChannelId(); // 呼叫成功后获取信令 channelId
      }
      @Override
      public void onJoinFail(String msg, int code) {
      }
    });
    
  • 主叫和被叫用户获取信令房间 channelId、RTC 房间的 cid 和 cname

    主叫和被叫用户在启动的通话页面 Activity(继承 CommonCallActivity 或其子类) 中,通过NERTCCallingDelegate#onJoinChannel回调获取主叫和被叫的 RTC 房间的 cid 和 cname、RTC 用户的 ID(rtcUid)、 IM 用户的 accId。

    javapublic class TestActivity extends P2PCallActivity {
      @NonNull
      @Override
      protected NERTCCallingDelegate provideRtcDelegate() {
        NERTCCallingDelegate sourceDelegate = super.provideRtcDelegate();
        return new NERtcCallDelegateForP2P() {
          @Override
          public void onError(int errorCode, @Nullable String errorMsg, boolean needFinish) {
            sourceDelegate.onError(errorCode, errorMsg, needFinish);
          }
          @Override
          public void onUserEnter(@Nullable String userId) {
            sourceDelegate.onUserEnter(userId);
          }
          @Override
          public void onCallEnd(@Nullable String userId) {
            sourceDelegate.onCallEnd(userId);
          }
          @Override
          public void onRejectByUserId(@Nullable String userId) {
            sourceDelegate.onRejectByUserId(userId);
          }
          @Override
          public void onUserBusy(@Nullable String userId) {
            sourceDelegate.onUserBusy(userId);
          }
          @Override
          public void onCancelByUserId(@Nullable String userId) {
            sourceDelegate.onCancelByUserId(userId);
          }
          @Override
          public void onCameraAvailable(@Nullable String userId, boolean isVideoAvailable) {
            sourceDelegate.onCameraAvailable(userId, isVideoAvailable);
          }
          @Override
          public void onVideoMuted(@Nullable String userId, boolean isMuted) {
            sourceDelegate.onVideoMuted(userId, isMuted);
          }
          // 主叫方和被叫方加入 Rtc 房间成功均会触发此回调
          @Override
          public void onJoinChannel(@Nullable String accId, long rtcUid, @Nullable String cname, long cid) {
            sourceDelegate.onJoinChannel(accId, uid, channelName, rtcChannelId);
            // accId 当前用户的云信 IM accid;
            // rtcUid 当前用户加入 Rtc 房间的 rtcUid;
            // cname 加入 Rtc 房间的房间名称;
            // cid 加入 Rtc 房间的 id 标识;
          }
          @Override
          public void onDisconnect(int res) {
            sourceDelegate.onDisconnect(res);
          }
          @Override
          public void timeOut() {
            sourceDelegate.timeOut();
          }
          @Override
          public void onCallFinished(@Nullable Integer code, @Nullable String msg) {
            super.onCallFinished(code, msg);
            releaseAndFinish(false);
          }
          @Override
          public void onCallTypeChange(@Nullable ChannelType type, int switchCallState) {
            sourceDelegate.onCallTypeChange(type, switchCallState);
          }
        };
      }
    }
    

不含 UI 集成的场景

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

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

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

    java// 构建呼叫参数
    SingleCallParam param =  new SingleCallParam(
      "被叫用户accid", // 被叫用户云信 IM accid
      ChannelType.VIDEO, // 呼叫类型为视频通话
      "呼叫时传入给被叫的扩展信息", // 呼叫时传入给被叫的扩展信息,例如用户昵称等
      null,
      null
    );
    // 发起呼叫
    NERTCVideoCall.sharedInstance().call(param, new JoinChannelCallBack() {
      @Override
      public void onJoinChannel(ChannelFullInfo channelFullInfo) {
      }
      @Override
      public void onJoinFail(String msg, int code) {
      }
    });
    
  2. 被叫用户获取相应的扩展信息。

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

    javaNERTCVideoCall.sharedInstance().addDelegate(new NERTCCallingDelegate() {
      @Override
      public void onInvited(InvitedInfo invitedInfo) {
        String info = invitedInfo.attachment; // 主叫方的透传数据
      }
    };
    

获取 RTC 用户 ID(rtcUid)

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

    javaVideoCallOptions options = new VideoCallOptions(new NERtcOption(), null);
    options.currentUserRtcUId = 10000L; // 示例,设置当前用户的 rtcUid
    NERTCVideoCall.sharedInstance().setupAppKey(this, "AppKey", options);
    
  2. 呼叫成功后,在通话中获取对端用户的 rtcUid。

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

javaNERTCVideoCall.sharedInstance().getRtcUidByAccId("用户的云信 IM accid");

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

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

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

    java// 构建呼叫参数
    SingleCallParam param =  new SingleCallParam(
      "被叫用户accid", // 被叫用户云信 IM accid
      ChannelType.VIDEO, // 呼叫类型为视频通话
      "呼叫时传入给被叫的扩展信息", // 呼叫时传入给被叫的扩展信息
      null,
      "自定义 Rtc 房间名称" // 自定义的 Rtc 房间名称
    );
    // 发起呼叫
    NERTCVideoCall.sharedInstance().call(param, new JoinChannelCallBack() {
      @Override
      public void onJoinChannel(ChannelFullInfo channelFullInfo) {
        String signalChannelId = channelFullInfo.getChannelId(); // 呼叫成功后获取信令 channelId
      }
      @Override
      public void onJoinFail(String msg, int code) {
      }
    })
    
  2. 主叫和被叫加入 RTC 房间成功后,会触发onJoinChannel 回调,您可以通过 onJoinChannel 回调获取主叫和被叫的 RTC 房间的 cid 和 cname、RTC 用户的 ID(rtcUid)、 IM 用户的 accId。 通过 onInvited 回调获取被叫信令房间的 channelId。

    javaNERTCVideoCall.sharedInstance().addDelegate(new NERTCCallingDelegate() {
      // 主叫方和被叫方加入 RTC 房间成功均会触发此回调
      @Override
      public void onJoinChannel(String accId, long rtcUid, String cname, long cid) {
        // accId 当前用户的云信 IM accid;
        // rtcUid 当前用户加入 Rtc 房间的 rtcUid;
        // cname 加入 Rtc 房间的房间名称;
        // cid 加入 Rtc 房间的 id 标识;
      }
      // 收到呼叫邀请时会触发此回调     
      @Override
      public void onInvited(InvitedInfo invitedInfo) {
        String signalChannelId = invitedInfo.channelId; // 被叫方获取信令的 channelId
      }
    
    };
    

请在收到 onJoinChannelonInvited 回调时,自行保存这些信息。

此文档是否对你有帮助?
有帮助
去反馈
  • 背景信息
  • 含 UI 集成的场景
  • 呼叫时透传扩展信息给被叫
  • 在呼叫的 UI 页面传递扩展信息(类似 Intent)
  • 获取 RTC 用户 ID(rtcUid)
  • 获取信令房间的 channelId、RTC 房间的 cid 和 cname
  • 不含 UI 集成的场景
  • 呼叫时透传扩展信息给被叫
  • 获取 RTC 用户 ID(rtcUid)
  • 获取信令房间的 channelId、RTC 房间的 cid 和 cname