实现单聊呼叫
更新时间: 2026/06/04 13:41:23
呼叫组件(NERTCCallkit)通过 UI 组件化的方式,简化了呼叫流程,您只需要调用几行代码,就可以实现单聊(1 对 1)呼叫,即点对点呼叫,并包含呼叫的 UI 界面。本文介绍呼叫组件的集成和实现方法。
注意事项
- 呼叫组件(NERTCCallkit)基于网易云信 NIM SDK 和 NERTC SDK 实现通话呼叫。
- 针对呼叫组件中的回调信息,开发者要做好相应回调数据的上报及存储,以便于后期上线之后排查问题。
基本概念
account_id:account_id是 IM 账号 ID,用于登录 IM。注册 IM 账号时,IM 服务器会返回对应的账号 ID(account_id)和密钥(Token),应用客户端需要负责保存 account_id 和 IM Token 的映射关系。- Token:呼叫组件中涉及的 Token 包括 IM Token,用于登录 IM 时进行 IM 账号鉴权。应用服务器调用 IM 服务器的 注册账号 API,获取的 IM Token。
开发环境
| 环境要求 | 说明 |
|---|---|
| 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 及以上版本的真机。 |
准备工作
根据本文操作前,请确保您已经完成了以下设置:
示例项目源码
网易云信提供 示例项目源码,您可以基于该源码进行修改适配。
集成呼叫组件
呼叫组件(NERTCCallkit)基于网易云信 NIM SDK(V10)和 NERTC SDK 实现通话呼叫,呼叫组件中已集成 NIM SDK 和 NERTC SDK。您只需集成 NERTCCallkit 即可。
-
在项目根目录下的 build.gradle 文件中,配置
repositories(使用 maven)。示例代码如下:Groovyallprojects { repositories { //... mavenCentral() //... } } -
在 app 目录下的 build.gradle 文件中,配置支持的 SO 库架构。示例代码如下:
Groovyandroid { defaultConfig { ndk { //设置支持的 SO 库架构 abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64" } } } -
根据开发者项目的需求,引入呼叫组件。
使用呼叫组件底层需要依赖 NIM SDK、NERTC SDK。
引入呼叫组件(不指定依赖的版本)直接引入呼叫组件,组件会自动使用当前兼容的依赖版本,无需单独指定。
gradleimplementation 'com.netease.yunxin.kit.call:call-ui:3.3.0'引入呼叫组件(指定依赖的版本)若您的项目已集成 NIM SDK 或 NERTC SDK,需指定具体版本并排除组件内置依赖。
gradle//如果因业务需求或其他原因无法使用指定版本 SDK时xu'yao implementation('com.netease.yunxin.kit.call:call-ui:3.3.0') { exclude group: 'com.netease.nimlib' exclude group: 'com.netease.yunxin', module: 'nertc-base-sdk' } // 使用您项目中已有的 SDK 版本 implementation 'com.netease.nimlib:basesdk:10.6.0' // IM 基础功能包示例版本,请使用实际版本 // implementation "com.netease.nimlib:chatroom:10.6.0" // IM 聊天室功能包示例版本,请使用实际版本 implementation 'com.netease.yunxin:nertc:5.6.50' // RTC 包示例版本,请使用实际版本- 呼叫组件各个版本的依赖版本请参考 呼叫组件更新日志。
- IM 相关组件的依赖版本需要一致(比如 IM 基础包和聊天室的版本相同),否则会报错。
-
添加权限。
根据实际应用需求,在
AndroidManifest.xml中添加以下配置,并请将com.netease.nim.demo替换为自己的包名。具体示例代码
XML<?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.CHANGE_WIFI_STATE"/> <!-- 外置存储存取权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 多媒体相关 --> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <!-- Android11:V8.6.1 及之后的版本不需要。其他:V4.4.0 及之后的版本不需要。 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 控制呼吸灯,振动器等,用于新消息提醒 --> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.VIBRATE" /> <!-- 8.0+系统需要--> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 下面的 uses-permission 一起加入到您的 AndroidManifest 文件中。--> <permission android:name="${applicationId}.permission.RECEIVE_MSG" android:protectionLevel="signature"/> <uses-permission android:name="${applicationId}.permission.RECEIVE_MSG"/> <application ...> <!-- App Key, 可以在这里设置,也可以在 SDKOptions 中提供。 如果 SDKOptions 中提供了,则取 SDKOptions 中的值。--> <meta-data android:name="com.netease.nim.appKey" android:value="key_of_your_app" /> <!-- 网易云信后台服务,请使用独立进程。--> <service android:name="com.netease.nimlib.service.NimService" android:process=":core"/> <!-- 网易云信后台服务,使用 V10 接口需要添加以下代码。--> <service android:name="com.netease.nimlib.service.NimServiceV2" /> <!-- 网易云信后台辅助服务 --> <service android:name="com.netease.nimlib.job.NIMJobService" android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE" android:process=":core"/> <!-- 网易云信监视系统启动和网络变化的广播接收器,保持和 NimService 同一进程 --> <receiver android:name="com.netease.nimlib.service.NimReceiver" android:process=":core" android:exported="false"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> <!-- 网易云信进程间通信 Receiver --> <receiver android:name="com.netease.nimlib.service.ResponseReceiver"/> <!-- 网易云信进程间通信 service --> <service android:name="com.netease.nimlib.service.ResponseService"/> <!-- 网易云信进程间通信 provider --> <provider android:name="com.netease.nimlib.ipc.NIMContentProvider" android:authorities="${applicationId}.ipc.provider" android:exported="false" android:process=":core" /> <!-- 网易云信内部使用的进程间通信 provider --> <!-- SDK 启动时会强制检测该组件的声明是否配置正确,如果检测到该声明不正确,SDK 会主动抛出异常引发崩溃 --> <provider android:name="com.netease.nimlib.ipc.cp.provider.PreferenceContentProvider" android:authorities="${applicationId}.ipc.provider.preference" android:exported="false" /> <!-- 网易云信内部使用的进程间通信 provider --> <!-- SDK 启动时会强制检测该组件的声明是否配置正确,如果检测到该声明不正确,SDK 会主动抛出异常引发崩溃 --> <provider android:name="com.netease.nimlib.ipc.cp.provider.PreferenceContentProvider" android:authorities="com.netease.nim.demo.ipc.provider.preference" android:exported="false" /> </application> </manifest> -
配置防代码混淆。
代码混淆是指使用简短无意义的名称重命名类、方法、属性等,增加逆向工程的难度,保障 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 {*;}
初始化呼叫组件
您可以在应用代码的任意位置进行初始化。
-
调用
NIMClient#initV2方法进行 IM 的初始化。SDK 的配置信息请参考
SDKOptions。示例代码如下:
Java// 激活 V10 API 后,可以根据该字段选项选择是否禁用 V10 API 登录,默认 false,即使用 V10 API 登录 // sdkOptions.disableV2Login = true; ... // 按需设置其它 SDKOptions 设置项 NIMClient.initV2(context, sdkOptions);以上提供了一个简化的初始化示例,更多初始化信息请参考 初始化 NIM SDK。
-
调用
init接口进行呼叫组件的初始化。初始化时必须设置rtcAppKey参数,其他参数可以按需配置。rtcAppKey为网易云信应用的 AppKey,请在 网易云信控制台 中应用详情页面中查看指定应用的 AppKey。App 用户在本端完成初始化后才可以正常接收其他人的的呼叫,或主动发起呼叫。若未完成初始化,组件可能会提示应用进行初始化,或被叫方 App 在被呼叫时无提示。若 App 重复调用初始化接口,则会销毁上次初始化设置,以新的初始化设置为准。
呼叫组件初始化相关代码内容可以放在工程的
MainActivity中执行,尽量避免在MainActivity#onDestroy()方法中做组件的释放。建议在 App 用户登出时释放,登入时进行初始化。核心功能参数说明请参考 初始化参数配置。
示例代码如下:
JavaCallKitUIOptions options = new CallKitUIOptions.Builder() // 必要:音视频通话 sdk appKey,用于通话中使用 .rtcAppKey(appKey) // 通话接听成功的超时时间单位 毫秒,默认 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);
登录
调用 login 方法进行登录。
本文以实现 静态 Token 登录为例,动态 Token 登录以及自动登录的实现方法请参考 登录。
示例代码如下:
JavaNIMClient.getService(V2NIMLoginService.class).login("account", "token", null, new V2NIMSuccessCallback<Void>() {
@Override
public void onSuccess(Void unused) {
// TODO
}
},
new V2NIMFailureCallback() {
@Override
public void onFailure(V2NIMError error) {
int code = error.getCode();
String desc = error.getDesc();
// TODO
}
});
实现单聊呼叫
呼叫组件(NERTCCallkit)的典型应用场景为单聊呼叫场景,即用户 A 发起视频呼叫用户 B,用户 B 同意呼叫,通话接通、两人进行实时音视频通信。
呼叫组件 UI kit 内部已包括了呼叫的相关逻辑,您只需要调用几行代码触发呼叫即可。
单聊呼叫的业务流程如下:
-
用户 A 以及用户 B 均完成网易云信 IM SDK 的登录,并成功初始化呼叫组件。
-
用户 A 获取到自己以及用户 B 登录网易云信 IM SDK 的账号(account_id)。
-
用户 A 通过
startSingleCall呼叫用户 B。Java// @param type:呼叫类型 NECallType.AUDIO-音频呼叫,NECallType.VIDEO-视频呼叫 // @param calledAccId:被叫方 IM 账号 account_id CallParam param = new CallParam.Builder() .callType(NECallType.VIDEO) .calledAccId(calledAccId) .build(); CallKitUI.startSingleCall(getActivity(), param); -
用户 B 单击被叫页面的接听按钮进行视频通话。
-
通话完成后单击挂断即可。
自定义 UI
您可以根据呼叫组件已有设置,自定义界面,详情请参考 自定义 UI。
进阶功能
呼叫组件(NERTCCallkit)除基础呼叫流程外,还支持话单功能、自定义 UI 等,您可以参考进阶功能文档实现相关业务流程。




