获取主被叫用户信息(V1)
更新时间: 2024/08/23 10:16:57
在报表统计等场景中,您可能需要上报主被叫的一些用户信息。本文介绍获取主被叫的用户 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 集成的场景
呼叫时透传扩展信息给被叫
您可以在发起呼叫时设置扩展信息,例如用户昵称等。
-
发起呼叫时设置扩展信息。
java
CallParam param = new CallParam.Builder() .addCalledUserAccId("被叫用户accid") // 被叫用户云信 IM accid .channelType(ChannelType.VIDEO.getValue()) // 呼叫类型为视频 .callExtraInfo("呼叫时传入给被叫的扩展信息") .build(); CallKitUI.startSingleCall(this, param);
-
(可选)自定义 UI 场景中,若页面的 Activity(继承 CommonCallActivity 或其子类)启动方为主叫,则需要用户手动调用
doCall
方法发起呼叫。自定义 UI 场景需要执行此步骤,否则不需要。
java
doCall(new JoinChannelCallBack() { @Override public void onJoinChannel(ChannelFullInfo channelFullInfo) { } @Override public void onJoinFail(String msg, int code) { } }, getCallParam().getCallExtraInfo()); // 将 UI 层数据传给 API 层
-
被叫用户获取透传的扩展信息。
被叫用户在启动的被叫页面 Activity(继承 CommonCallActivity 或其子类) 中通过如下方式获取主叫透传的扩展信息。
java
public 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,但是不需要给被叫。可参考如下方式实现:
-
设置将扩展信息透传给本地对应的呼叫 Activity。
java
CallParam param = new CallParam.Builder() ..... .addExtras("key", "实现 Serializable 或 Parcelable 接口对象") .build(); CallKitUI.startSingleCall(this, param);
-
UI 层获取扩展信息。
java
public 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)
-
(可选)在初始化呼叫组件时,设置当前用户的 RTC 用户 ID(rtcUid)。如果不设置,则使用随机分配的 rtcUid。
java
CallKitUIOptions options = new CallKitUIOptions.Builder() .currentUserRtcUId(1000L) // 示例 .build(); CallKitUI.init(getApplicationContext(), options);
-
呼叫成功后,在通话中获取对端用户的 rtcUid。
根据 IM 的 accid 获取对应的 rtcUid。
javaNERTCVideoCall.sharedInstance().getRtcUidByAccId("用户的云信 IM accid");
获取信令房间的 channelId、RTC 房间的 cid 和 cname
-
获取 RTC 房间名称
RTC 房间的 cname 在发起呼叫时自行设置,但是需要保证唯一性。参数的格式要求请参见 RTC 的channelName格式说明。
java
CallParam param = new CallParam.Builder() ...... .rtcChannelName("自定义 cname") // 自定义的 Rtc cname 房间名称 .build(); CallKitUI.startSingleCall(this, param);
-
主叫用户获取信令房间的 channelId
java
doCall(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。java
public 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 集成的场景
呼叫时透传扩展信息给被叫
您可以在发起呼叫时设置扩展信息,例如用户昵称等。
-
发起呼叫时设置扩展信息。
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) { } });
-
被叫用户获取相应的扩展信息。
被叫用户在收到来电通知时,通过
NERTCCallingDelegate#onInvited
回调中的InvitedInfo
参数获取主叫方透传的扩展信息。java
NERTCVideoCall.sharedInstance().addDelegate(new NERTCCallingDelegate() { @Override public void onInvited(InvitedInfo invitedInfo) { String info = invitedInfo.attachment; // 主叫方的透传数据 } };
获取 RTC 用户 ID(rtcUid)
-
(可选)在初始化呼叫组件时,设置当前用户的 RTC 用户 ID(rtcUid)。如果不设置,则使用随机分配的 rtcUid。
java
VideoCallOptions options = new VideoCallOptions(new NERtcOption(), null); options.currentUserRtcUId = 10000L; // 示例,设置当前用户的 rtcUid NERTCVideoCall.sharedInstance().setupAppKey(this, "AppKey", options);
-
呼叫成功后,在通话中获取对端用户的 rtcUid。
根据 IM 的 accid 获取对应的 rtcUid。
javaNERTCVideoCall.sharedInstance().getRtcUidByAccId("用户的云信 IM accid");
获取信令房间的 channelId、RTC 房间的 cid 和 cname
-
在发起呼叫时传入相关参数。
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) { } })
-
主叫和被叫加入 RTC 房间成功后,会触发
onJoinChannel
回调,您可以通过onJoinChannel
回调获取主叫和被叫的 RTC 房间的 cid 和 cname、RTC 用户的 ID(rtcUid)、 IM 用户的 accId。 通过onInvited
回调获取被叫信令房间的 channelId。java
NERTCVideoCall.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 } };
请在收到 onJoinChannel
和 onInvited
回调时,自行保存这些信息。