实现单聊呼叫

更新时间: 2026/06/04 13:41:23

呼叫组件(NERTCCallkit)通过 UI 组件化的方式,简化了呼叫流程,您只需要调用几行代码,就可以实现单聊(1 对 1)呼叫,即点对点呼叫,并包含呼叫的 UI 界面。本文介绍呼叫组件的集成和实现方法。

注意事项

  • 呼叫组件(NERTCCallkit)基于网易云信 NIM SDK 和 NERTC SDK 实现通话呼叫。
  • 针对呼叫组件中的回调信息,开发者要做好相应回调数据的上报及存储,以便于后期上线之后排查问题。

基本概念

  • account_idaccount_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 Studio 版本编号系统的变更请参考 Android Studio 版本说明
Android API 版本 Level 为 21 及以上版本。
Android SDK 版本 Android SDK 31、Android SDK Platform-Tools 31.x.x 及以上版本。
Gradle 及所需的依赖库 Gradle Services 页面下载对应版本的 Gradle 及所需的依赖库。
  • Gradle 版本:7.4.1
  • Android Gradle 插件版本: 7.1.3
    关于 Android Gradle 插件、Gradle、SDK Tool 之间的版本依赖关系,请参考 Android 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 即可。

  1. 在项目根目录下的 build.gradle 文件中,配置 repositories(使用 maven)。示例代码如下:

    Groovyallprojects {
        repositories {
            //...
            mavenCentral()
            //...
        }
    }
    
  2. app 目录下的 build.gradle 文件中,配置支持的 SO 库架构。示例代码如下:

    Groovyandroid {
    defaultConfig {
        ndk {
            //设置支持的 SO 库架构
            abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64"
            }
    }
    }
    
  3. 根据开发者项目的需求,引入呼叫组件。

    使用呼叫组件底层需要依赖 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 基础包和聊天室的版本相同),否则会报错。
  4. 添加权限。

    根据实际应用需求,在 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>
    
  5. 配置防代码混淆。

    代码混淆是指使用简短无意义的名称重命名类、方法、属性等,增加逆向工程的难度,保障 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 {*;}
    

初始化呼叫组件

您可以在应用代码的任意位置进行初始化。

  1. 调用 NIMClient#initV2 方法进行 IM 的初始化。

    SDK 的配置信息请参考 SDKOptions

    示例代码如下:

    Java// 激活 V10 API 后,可以根据该字段选项选择是否禁用 V10 API 登录,默认 false,即使用 V10 API 登录
    // sdkOptions.disableV2Login = true;
    ...
    // 按需设置其它 SDKOptions 设置项
    
    NIMClient.initV2(context, sdkOptions);
    

    以上提供了一个简化的初始化示例,更多初始化信息请参考 初始化 NIM SDK

  2. 调用 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 内部已包括了呼叫的相关逻辑,您只需要调用几行代码触发呼叫即可。

单聊呼叫的业务流程如下:

  1. 用户 A 以及用户 B 均完成网易云信 IM SDK 的登录,并成功初始化呼叫组件。

  2. 用户 A 获取到自己以及用户 B 登录网易云信 IM SDK 的账号(account_id)。

  3. 用户 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);
    
  4. 用户 B 单击被叫页面的接听按钮进行视频通话。

  5. 通话完成后单击挂断即可。

自定义 UI

您可以根据呼叫组件已有设置,自定义界面,详情请参考 自定义 UI

进阶功能

呼叫组件(NERTCCallkit)除基础呼叫流程外,还支持话单功能、自定义 UI 等,您可以参考进阶功能文档实现相关业务流程。

此文档是否对你有帮助?
有帮助
去反馈
  • 注意事项
  • 基本概念
  • 开发环境
  • 准备工作
  • 示例项目源码
  • 集成呼叫组件
  • 初始化呼叫组件
  • 登录
  • 实现单聊呼叫
  • 自定义 UI
  • 进阶功能