实现1对1呼叫(含UI集成-V2)
更新时间: 2024/08/23 10:16:57
呼叫组件(NERTCCallkit)通过 UI 组件化的方式,简化了呼叫流程,您只需要调用几行代码,就可以实现 1 对 1 呼叫,并包含呼叫的 UI 界面。本文介绍呼叫组件 V2 版本 的集成和实现方法。
如果您需要含 UI 集成呼叫组件 V1 版本,请参见实现1对1呼叫(含UI集成-V1)。
注意事项
- 呼叫组件(NERTCCallkit)默认使用 RTC 调试模式。应用正式上线前,请在控制台中将指定应用的 RTC 鉴权方式改回安全模式。安全模式下需要使用 Token 加入房间,详细说明请参考Token 鉴权。
- 针对呼叫组件中的回调信息,开发者要做好相应回调数据的上报及存储,以便于后期上线之后排查问题。
基本概念
- accid:accid 是 IM 账号,用于登录 IM。注册云信 IM 账号时, IM 服务器会返回对应的 accid 和 Token,应用客户端需要负责保存 accid 和 IM token 的映射关系。
- Token:呼叫组件中涉及的 Token 包括 IM Token 和 RTC Token。两者不是同一个 Token,请根据实际使用场景填入对应的 Token。
- IM Token:用于登录 IM 时进行 IM 账号鉴权。应用服务器调用 IM 服务器的
create.action
注册云信 IM 账号时,获取的 IM Token。 - RTC Token:用于加入 RTC 房间时进行 RTC 账号鉴权。应用服务器调用 NERTC 服务器的
getToken
,获取的 RTC Token。
- IM Token:用于登录 IM 时进行 IM 账号鉴权。应用服务器调用 IM 服务器的
开发环境
环境要求 | 说明 |
---|---|
Android Studio 版本 | Android Studio 5.0 及以上版本 |
Android API 版本 | Level 为 21 及以上版本。 |
Android SDK 版本 | Android SDK 31、Android SDK Platform-Tools 31.x.x 及以上版本。 |
Gradle 及所需的依赖库 | 在 Gradle Services 页面下载对应版本的 Gradle 及所需的依赖库。
|
kotlin | 1.6.21 及以上版本 |
CPU架构 | ARM 64、ARMV7 |
IDE | Android Studio |
其他 | 依赖 Androidx,不支持 support 库。 Android 系统 5.0 及以上版本的真机。 |
准备工作
示例项目源码
网易云信提供 1 对 1 视频通话示例项目源码 ,您可以基于该源码进行修改适配。
集成呼叫组件
呼叫组件(NERTCCallkit)基于网易云信 NIM SDK 和 NERTC SDK 实现通话呼叫,呼叫组件中已集成 NERTC SDK,您只需集成指定版本的 NIM SDK 即可。
步骤 1: 集成 NIM SDK
单击查看集成 NIM SDK 的操作步骤。如果您的项目中已经集成了 NIM SDK,请忽略该步骤。
-
若您需要创建新项目,在 Android Studio 里,在顶部菜单依次选择 File > New > New Project 新建工程,再依次选择 Phone and Tablet > Empty Activity,单击 Next。
创建 Android 项目成功后,Android Studio 会自动开始同步 gradle, 您需要等同步成功后再进行下一步操作。
-
在项目根目录下的 “build.gradle” 文件中,配置
repositories
(使用 maven)。示例代码如下:groovy
allprojects { repositories { mavenCentral() } }
-
在 “app” 目录下的 “build.gradle” 文件中,配置支持的 SO 库架构。示例代码如下:
groovy
android { defaultConfig { ndk { //设置支持的SO库架构 abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64" } } }
-
根据开发者项目的需求,添加对应的依赖。
groovy
dependencies { implementation fileTree(dir: 'libs', include: '*.jar') // 添加依赖。 // 基础功能 (必需) implementation "com.netease.nimlib:basesdk:${LATEST_VERSION}" }
-
添加权限。
根据实际应用需求,在
AndroidManifest.xml
设置权限(请将com.netease.nim.demo
替换为自己的包名)。<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.netease.nim.demo"> <!-- 权限声明 --> <!-- 访问网络状态--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 音视频呼叫--> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <application ...> <!-- APP Key, 可以在这里设置,也可以在 SDKOptions 中提供。 如果 SDKOptions 中提供了,则取 SDKOptions 中的值。 --> <meta-data android:name="com.netease.nim.appKey" android:value="key_of_your_app" /> </application> </manifest>
SDK 版本限制:
-
呼叫组件与 NIM SDK、NERTC SDK 之间存在映射关系,使用呼叫组件时,必须使用指定版本的 NIM SDK 和 NERTC SDK。当前最新版本 V2.1.0 适配 NIM SDK V9.12.0 和 NERTC SDK V5.4.0,其他版本的适配关系请参考更新日志。
-
如果您已经集成了 NIM SDK 和 NERTC SDK,或因业务需求等原因无法使用指定版本 SDK,请联系网易云信技术支持确认是否能替换 SDK 版本,并参考 Gradle 引入呼叫组件中的步骤 3 去除呼叫组件依赖的版本。
步骤 2:初始化 NIM SDK
在 Application
的 onCreate
中,调用 init
方法 初始化 NIM SDK。
示例代码如下:
public class NimApplication extends Application {
public void onCreate() {
NIMClient.init(this, loginInfo(), options());
// 如果提供用户信息,将同时进行自动登录。如果当前还没有登录用户,请传入null。
private LoginInfo loginInfo() {
return null;
}
// 设置初始化配置参数,如果返回值为 null,则全部使用默认参数。
private SDKOptions options() {
SDKOptions options = new SDKOptions();
return options;
}// 可在 SDKOptions 中配置 App Key
}
}
以上提供了一个简化的初始化示例,更多初始化信息请参见初始化 SDK。
步骤 3:实现登录 IM
调用login
方法登录 IM。
本文以实现静态 Token 登录为例,动态 Token 登录以及自动登录的实现方法请参见登录 IM。
示例代码如下:
public class LoginActivity extends Activity {
public void doLogin() {
LoginInfo info = new LoginInfo(); //传入accid和token
RequestCallback<LoginInfo> callback =
new RequestCallback<LoginInfo>() {
@Override
public void onSuccess(LoginInfo param) {
LogUtil.i(TAG, "login success");
// your code
}
@Override
public void onFailed(int code) {
if (code == 302) {
LogUtil.i(TAG, "账号密码错误");
// your code
} else {
// your code
}
}
@Override
public void onException(Throwable exception) {
// your code
}
};
NIMClient.getService(AuthService.class).login(info).setCallback(callback);
}
}
步骤 4: Gradle 引入呼叫组件
-
在工程根部目录的
build.gradle
文件中添加如下代码。allprojects { repositories { //... mavenCentral() //... } }
-
在主工程
build.gradle
文件中添加如下代码,引入呼叫组件。// 若出现 More than one file was found with OS independent path 'lib/arm64-v8a/libc++_shared.so'. // 可以在主 module 的 build.gradle 文件中 android 闭包内追加如下 packageOptions 配置 android{ //...... packagingOptions { pickFirst 'lib/arm64-v8a/libc++_shared.so' pickFirst 'lib/armeabi-v7a/libc++_shared.so' } } // 引入呼叫组件安装包,导入以下其中一个 dependencies { implementation 'com.netease.yunxin.kit.call:call-ui:2.1.0' // 含 UI 集成时,请导入这个包 implementation 'com.netease.yunxin.kit.call:call:2.1.0' // 基础组件包,不含UI 集成时请导入这个包 }
-
(可选)去除呼叫组件依赖的 SDK。
如果因业务需求或其他原因无法使用指定版本 SDK,您可以参考如下步骤去除呼叫组件依赖的 IM 和 RTC 的 SDK。
implementation('com.netease.yunxin.kit.call:call-ui:1.8.1') { exclude group: 'com.netease.nimlib'// 去除组件依赖的 IM sdk exclude group: 'com.netease.yunxin', module: 'nertc-base' // 去除组件依赖的 NERTC sdk }
-
配置防代码混淆。
代码混淆是指使用简短无意义的名称重命名类、方法、属性等,增加逆向工程的难度,保障 Android 程序源码的安全性。为了避免因重命名类,导致调用呼叫组件异常,您需要配置防代码混淆。
请在
proguard-rules.pro
配置文件中加入以下代码防止混淆:# NIM SDK的类,如果集成IM时已经添加,请忽略 -dontwarn com.netease.nim.** -keep class com.netease.nim.** {*;} -dontwarn com.netease.nimlib.** -keep class com.netease.nimlib.** {*;} -dontwarn com.netease.share.** -keep class com.netease.share.** {*;} -dontwarn com.netease.mobsec.** -keep class com.netease.mobsec.** {*;} # NERTC SDK的类 -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 {*;}
步骤 5: 初始化呼叫组件 NERTCCallkit
IM 登录成功之后,需要调用 init
接口进行呼叫组件的初始化。初始化时需要设置以下必选参数,其他参数可以按需配置。
- rtcAppKey:网易云信应用的 AppKey,请在控制台中应用详情页面中查看指定应用的 AppKey。
- currentUserAccId:当前用户的 IM accId。
App 用户在本端完成初始化后才可以正常接收其他人的的呼叫,或主动发起呼叫。若未完成初始化,组件可能会提示应用进行初始化,或被叫方 App 在被呼叫时无提示。若 App 重复调用初始化接口,则会销毁上次初始化设置,以新的初始化设置为准。
呼叫组件初始化相关代码内容可以放在工程的 MainActivity
中执行,尽量避免在 MainActivity#onDestroy()
方法中做组件的释放。建议在 App 用户登出时释放,登入时进行初始化。
-
初始化呼叫组件相关步骤需要在 IM 登录成功之后进行。
-
核心功能参数说明请参见初始化参数配置。
示例代码:
javaCallKitUIOptions 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);
实现 1 对 1 呼叫(点对点呼叫)
呼叫组件(NERTCCallkit)的典型应用场景为 1 对 1 呼叫场景,即用户 A 发起视频呼叫用户 B ,用户 B 同意呼叫,通话接通、两人进行实时音视频通信。
呼叫组件 UI kit 内部已包括了呼叫的相关逻辑,您只需要调用几行代码触发呼叫即可。
1 对 1 呼叫的业务流程如下:
-
用户 A 以及用户 B 均完成云信 IM SDK 的登录,并成功初始化呼叫组件。
-
用户 A 获取到自己以及用户 B 登录云信 IM SDK 的账号(accid)。
-
用户 A 通过
startSingleCall
呼叫用户 B。java
// @param type:呼叫类型 NECallType.AUDIO-音频呼叫,NECallType.VIDEO-视频呼叫 // @param calledAccId: 被叫方 IM 账号 accid CallParam param = new CallParam.Builder() .callType(NECallType.VIDEO) .calledAccId(calledAccId) .build(); CallKitUI.startSingleCall(getActivity(), param);
-
用户 B 点击被叫页面的接听按钮进行视频通话。
-
通话完成后点击挂断即可。
进阶功能
呼叫组件(NERTCCallkit)除基础呼叫流程外,还支持话单功能、自定义 UI 等,您可以参考进阶功能文档实现相关业务流程。