实现音视频通话
更新时间: 2024/07/26 13:39:23
自 IM UIKit v9.4.0 开始,会话消息模块(chatkit-ui
)支持音视频通话功能。该功能基于云信呼叫组件实现。
本文介绍如何引入和初始化呼叫组件,进而在您的 IM 应用中实现音视频通话。
功能介绍
实现音视频通话功能后,用户在会话界面的输入区域点击更多>音视频 (>),即可快速发起音频通话或视频通话。
开发环境
环境要求 | 说明 |
---|---|
JDK 版本 | 1.8.0 及以上版本 |
Android API 版本 | API 31、Android 5.0 及以上版本 |
CPU 架构 | ARM64、ARMV7 |
IDE | Android Studio |
其他 | 依赖 Androidx,不支持 support 库。Android 系统 5.0 或以上版本的移动设备。 |
前提条件
实现流程
步骤1:引入呼叫组件
在您的工程的 build.gradle 中引入呼叫组件。
javadependencies {
// 引入呼叫组件安装包
implementation("com.netease.yunxin.kit.call:call-ui:1.8.2")// UI 包
// 呼叫组件依赖的信令 SDK,信令 SDK 版本保持和依赖的 NIM SDK 一致
implementation("com.netease.nimlib:avsignalling:9.11.0") //呼叫组件 依赖信令包
}
- 建议引入呼叫组件 1.8.2 及以上版本。
- 如果引入之前的版本,则不支持下文的步骤 4 提及的通过
XKitRouter
路由方式发起音视频通话。您需要修改源码来调用呼叫组件的音视频通话能力。
步骤2:防混淆
代码混淆是指使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度,保障 Android 程序源码的安全性。
为了避免因上述的重命名而导致调用呼叫组件异常,请在 proguard-rules.pro 文件中加入以下代码,将呼叫组件相关类加入不混淆名单。
java-keep class com.netease.lava.** {*;}
-keep class com.netease.yunxin.** {*;}
-dontwarn com.netease.yunxin.kit.**
-keep class com.netease.yunxin.kit.** {*;}
-keep public class * extends com.netease.yunxin.kit.corekit.XKitInitOptions
-keep class * implements com.netease.yunxin.kit.corekit.XKitService {*;}
步骤3:初始化呼叫组件
对于不同的呼叫 UI 组件版本,初始化接口不同。
使用低于 2.1.0 版本的呼叫 UI 组件
在发起音视频通话前,需先调用CallKitUI.init
方法初始化呼叫组件。
- 呼叫组件初始化相关代码内容,建议放在工程的
MainActivity
中执行,尽量避免在MainActivity#onDestroy()
方法中做组件的释放。建议在 App 用户登出时释放,登入时进行初始化。 - 在 IM Demo 中,我们将该初始化方法,放在了
MainActiviy
页面。
参数 |
类型 |
必传 | 说明 |
---|---|---|---|
rtcAppKey |
String | 是 | 在云信控制台创建应用时获取到的 App Key |
currentUserAccId |
String | 是 | 当前用户的 IM 账号(accid),可通过如下两种方式注册:
|
timeOutMillisecond |
Long | 否 | 呼叫/接听的超时时间,默认 30 秒。单位:毫秒 |
notificationConfigFetcher |
Function1<InvitedInfo, CallKitNotificationConfig> | 否 | 根据呼叫邀请信息 InvitedInfo 确定展示的通知提示,可配置通知图标、通知 channelId、标题、通知内容 |
resumeBGInvitation |
Boolean | 否 | 应用在后台时,收到呼叫邀请未唤起应用被叫页面,此时点击桌面图标唤起应用时,是否展示被叫页面。默认为 true |
rtcTokenService |
TokenService | 否 | 请求 RTC Token,需自行实现。如果使用呼叫组件 v1.8.0 及以上版本,调试环境中无需设置,应用正式上线后的生产环境中必须设置。RTC Token 相关详情,请参见 RTC Token 鉴权
|
rtcSdkOption |
NERtcOption |
否 | NERTC SDK 初始化的配置,会透传给 SDK |
rtcInitScope |
Boolean | 否 | 呼叫组件初始化范围,默认为 true:
|
更多呼叫组件的初始化参数说明,请参见初始化参数配置。
示例代码:
xmlCallKitUIOptions options = new CallKitUIOptions.Builder()
.rtcAppKey(appKey)
.currentUserAccId(“currentUserAccIdFromIM”)
.timeOutMillisecond(30 * 1000L)
.notificationConfigFetcher(invitedInfo -> new CallKitNotificationConfig(R.drawable.ic_logo))
.resumeBGInvitation(true)
// 请求 rtc token 服务,若非安全模式则不需设置(V1.8.0版本之前需要配置,V1.8.0及之后版本无需配置)
//.rtcTokenService((uid, callback) -> requestRtcToken(appKey, uid, callback)) // 自己实现的 token 请求方法
// 设置初始化 rtc sdk 相关配置,按照所需进行配置
.rtcSdkOption(new NERtcOption())
.rtcInitScope(true)
.build();
// 若重复初始化会销毁之前的初始化实例,重新初始化
CallKitUI.init(getApplicationContext(), options);
使用 2.1.0 及以上版本的呼叫 UI 组件
在发起音视频通话前,需先调用 CallKitUI.init
方法初始化呼叫组件。
- 呼叫组件初始化相关代码内容,建议放在工程的
MainActivity
中执行,尽量避免在MainActivity#onDestroy()
方法中做组件的释放。建议在 App 用户登出时释放,登入时进行初始化。 - 在 IM Demo 中,我们将该初始化方法,放在了
MainActiviy
页面。
参数 |
类型 |
必传 | 说明 |
---|---|---|---|
appKey |
String | 是 | 在云信控制台创建应用时获取到的 App Key |
currentUserAccId |
String | 否 | 当前用户的 IM 账号 ID(accid) |
currentUserRtcUid |
Long | 否 | 当前用户的 RTC 账号 ID(uid) |
rtcConfig |
NERtcOption | 否 | RTC 私有化配置初始化对象,不需要私有化可空 |
enableAutoJoinSignalChannel |
Boolean | 否 | 被叫是否自动加入channel,默认 NO,不加入 |
enableJoinRtcWhenCall |
Boolean | 否 | 主叫是否在呼叫时加入 RTC,默认 NO,不加入 |
initRtcMode |
Integer | 否 | 是否在初始化呼叫组件时初始化 RTC,默认为 NECallInitRtcMode.GLOBAL(全局初始化),具体请参考NECallInitRtcMode |
rtcCallExtension |
CallExtension |
否 | 扩展字段,可以通过该参数实现修改音视频功能 |
更多呼叫组件的初始化参数说明,请参见初始化参数配置。
示例代码:
CallKitUIOptions options = new CallKitUIOptions.Builder()
// 必要:音视频通话 sdk appKey,用于通话中使用
.rtcAppKey(appKey)
// 必要:当前用户 AccId
.currentUserAccId(“currentUserAccIdFromIM”)
// 通话接听成功的超时时间单位 毫秒,默认30s
.timeOutMillisecond(30 * 1000L)
// 此处为 收到来电时展示的 notification 相关配置,如图标,提示语等。
.notificationConfigFetcher(neInviteInfo -> new CallKitNotificationConfig(R.drawable.ic_logo))
// 收到被叫时若 app 在后台,在恢复到前台时是否自动唤起被叫页面,默认为 true
.resumeBGInvitation(true)
// 请求 rtc token 服务,若非安全模式则不需设置(V1.8.0版本之前需要配置,V1.8.0及之后版本无需配置)
//.rtcTokenService((uid, callback) -> requestRtcToken(appKey, uid, callback)) // 自己实现的 token 请求方法
// 设置初始化 rtc sdk 相关配置,按照所需进行配置
.rtcSdkOption(new NERtcOption())
// 呼叫组件初始化 rtc 范围,NECallInitRtcMode.GLOBAL-全局初始化,
// NECallInitRtcMode.IN_NEED-每次通话进行初始化以及销毁,全局初始化有助于更快进入首帧页面,
// 当结合其他组件使用时存在rtc初始化冲突可设置NECallInitRtcMode.IN_NEED
// 或当结合其他组件使用时存在rtc初始化冲突可设置NECallInitRtcMode.IN_NEED_DELAY_TO_ACCEPT
.initRtcMode(NECallInitRtcMode.IN_NEED)
.build();
// 不要重复初始化组件可能会产生 sdk 初始化失败问题
CallKitUI.init(getApplicationContext(), options);
步骤4:发起音视频通话
云信已将呼叫组件的语音通话和视频通话能力注册到路由XKitRouter
中。因此您可通过该路由发起音视频通话。
调用navigate
方法,即可发起语音通话或视频通话。
方法原型如下:
java //带参数的界面跳转
XKitRouter.withKey(path).withParam(paramKey,param).withContext(context).navigate();
参数 |
类型 | 说明 |
---|---|---|
path |
String | 需跳转至的目标界面对应的路由地址 |
paramKey |
String | 传递到目标界面的参数 KEY |
param |
Serializable | 传递到目标界面的参数值 |
context |
Context | Activity 上下文 |
语音通话
发起语音通话的示例代码如下:
javaXKitRouter.withKey(RouterConstant.PATH_CALL_SINGLE_PAGE)
.withContext(getContext()) // Activity 上下文
.withParam(RouterConstant.KEY_CALLER_ACC_ID, IMKitClient.account()) // 呼叫方的 IM 账号(accid)
.withParam(RouterConstant.KEY_CALLED_ACC_ID, sessionID) // 被呼叫方的 IM 账号(accid)或者单聊会话 ID
.withParam(RouterConstant.KEY_CALL_TYPE, RouterConstant.KEY_CALL_TYPE_AUDIO) // 呼叫类型
.navigate();
视频通话
发起视频通话的示例代码如下:
javaXKitRouter.withKey(RouterConstant.PATH_CALL_SINGLE_PAGE)
.withContext(getContext()) // Activity 上下文
.withParam(RouterConstant.KEY_CALLER_ACC_ID, IMKitClient.account())// 呼叫方的 IM 账号(accid)
.withParam(RouterConstant.KEY_CALLED_ACC_ID, sessionID) // 被呼叫方的 IM 账号(accid)或者单聊会话 ID
.withParam(RouterConstant.KEY_CALL_TYPE, RouterConstant.KEY_CALL_TYPE_VIDEO) // 呼叫类型
.navigate();
相关信息
其他功能开通
如果需要实现“屏蔽黑名单用户发起的语音/视频通话请求”,需要在云信控制台开启该功能。 如未开通该功能,黑名单用户仍可以向将其拉黑的用户发起通话请求。
-
在控制台首页应用管理中选择应用,然后单击 IM 即时通讯下的功能配置按钮进入功能配置页。
-
在顶部选择基础功能页签,开启被拉黑时被拉黑者无法唤起呼叫。
错误码
呼叫组件相关错误码,请参见错误码。
常见问题
集成组件后出现编译错误
如果集成组件后出现报错expected reference but got (raw string) code example
,请在应用的主工程 styles.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>
更多问题,请参见呼叫组件常见问题。