音视频呼叫(原呼叫组件)
Android
动态与公告
更新日志
关于下架V1.1.0及之前版本的公告
组件简介
呼叫组件概述
Demo 体验
快速开始
开通服务
跑通示例项目
集成呼叫组件
进阶功能
自定义 UI
初始化参数配置
设置 RTC 的音视频属性
自定义呼叫铃声
拦截呼入请求
话单
私有化配置
API 参考与错误码
最佳实践
获取主被叫用户信息
常见问题

集成呼叫组件

更新时间: 2023/06/06 19:55:12

呼叫组件(NERTCCallkit)通过 UI 组件化的方式,简化了呼叫流程,您只需要调用几行代码,就可以实现 1 对 1 呼叫,并包含呼叫的 UI 界面。

注意事项

  • 呼叫组件(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。

开发环境

环境要求 说明
JDK 版本 1.8.0 及以上版本
Android API 版本 API 31、Android 5.0 及以上版本
CPU 架构 ARM64、ARMV7
IDE Android Studio
其他 依赖 Androidx,不支持 support 库。Android 系统 5.0 或以上版本的移动设备。

准备工作

  • 已在控制台创建应用,并获取了对应的 App Key。详细操作请参考创建应用

  • 已开通 IM 即时通讯、音视频通话 2.0 及信令产品。开通服务的操作流程请参考开通服务

  • 已在网易云信控制台开通音视频通话 2.0 产品的话单功能。详细操作请参考 话单

示例项目源码

网易云信提供 1 对 1 视频通话示例项目源码 ,您可以基于该源码进行修改适配。

集成呼叫组件

呼叫组件(NERTCCallkit)基于网易云信 NIM SDK 和 NERTC SDK 实现通话呼叫,呼叫组件中已集成 NERTC SDK,您只需集成指定版本的 NIM SDK 即可。

步骤 1: 集成 NIM SDK

单击查看集成 NIM SDK 的操作步骤。如果您的项目中已经集成了 NIM SDK,请忽略该步骤。
  1. 若您需要创建新项目,在 Android Studio 里,在顶部菜单依次选择 File > New > New Project 新建工程,再依次选择 Phone and Tablet > Empty Activity,单击 Next
    image

    创建 Android 项目成功后,Android Studio 会自动开始同步 gradle, 您需要等同步成功后再进行下一步操作。

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

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

    android {
    defaultConfig {
        ndk {
            //设置支持的SO库架构
            abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64"
            }
    }
    }
    
  4. 根据开发者项目的需求,添加对应的依赖。

    dependencies {
        implementation fileTree(dir: 'libs', include: '*.jar')
        // 添加依赖。
        
        // 基础功能 (必需)
        implementation "com.netease.nimlib:basesdk:${LATEST_VERSION}"
    }
    
  5. 添加权限。

    根据实际应用需求,在 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。当前最新版本 V1.8.2 适配 NIM SDK V9.8.0 和 NERTC SDK V4.6.29,其他版本的适配关系请参考更新日志

  • 如果您已经集成了 NIM SDK 和 NERTC SDK,或因业务需求等原因无法使用指定版本 SDK,请联系网易云信技术支持确认是否能替换 SDK 版本,并参考 Gradle 引入呼叫组件中的步骤 3 去除呼叫组件依赖的版本。

步骤 2:初始化 NIM SDK

ApplicationonCreate 中,调用 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 引入呼叫组件

  1. 在工程根部目录的 build.gradle 文件中添加如下代码。

    allprojects {
        repositories {
            //...
            mavenCentral()
            //...
        }
    }
    
  2. 在主工程 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:1.8.2'  // 含 UI 集成时,请导入这个包
        implementation 'com.netease.yunxin.kit.call:call:1.8.2'     // 基础组件包,不含UI 集成时请导入这个包
    
    }
    
  3. (可选)去除呼叫组件依赖的 SDK。

    如果因业务需求或其他原因无法使用指定版本 SDK,您可以参考如下步骤去除呼叫组件依赖的 IM 和 RTC 的 SDK。

    不同呼叫组件版本,代码分别如下:

    • V1.8.1 及之后版本:
    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
    }
    
    • V1.5.5 ~ V1.8.0 版本:(1.8.0的引入路径为'com.netease.yunxin.kit.call:call-ui:1.8.0')
    implementation('com.netease.yunxin.kit:call-ui:1.5.5') {
            exclude group: 'com.netease.nimlib'// 去除组件依赖的 IM sdk
            exclude group: 'com.netease.yunxin', module: 'nertc-full' // 去除组件依赖的 NERTC sdk
    }
    
    • V1.5.4 及之前版本:
    implementation('com.netease.yunxin.kit:call-ui:1.5.4') {
            exclude group: 'com.netease.nimlib'// 去除组件依赖的 IM sdk
            exclude group: 'com.netease.yunxin', module: 'nertc' // 去除组件依赖的 NERTC sdk
    }
    
  4. 配置防代码混淆。

    代码混淆是指使用简短无意义的名称重命名类、方法、属性等,增加逆向工程的难度,保障 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 登录成功之后进行。
  • rtcTokenService 参数只有 V 1.8.0 之前的版本才需要配置,V1.8.0及之后版本无需配置。
  • 核心功能参数说明请参见初始化参数配置

示例代码:

CallKitUIOptions options = new CallKitUIOptions.Builder()
			// 必要:音视频通话 sdk appKey,用于通话中使用
			.rtcAppKey(appKey)
			// 必要:当前用户 AccId
			.currentUserAccId(“currentUserAccIdFromIM”)
			// 通话接听成功的超时时间单位 毫秒,默认30s
			.timeOutMillisecond(30 * 1000L)
			// 此处为 收到来电时展示的 notification 相关配置,如图标,提示语等。
			.notificationConfigFetcher(invitedInfo -> 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 范围,true-全局初始化,false-每次通话进行初始化以及销毁
			// 全局初始化有助于更快进入首帧页面,当结合其他组件使用时存在rtc初始化冲突可设置false
			.rtcInitScope(true)
			.build();
// 若重复初始化会销毁之前的初始化实例,重新初始化
CallKitUI.init(getApplicationContext(), options);

实现 1 对 1 呼叫(点对点呼叫)

呼叫组件(NERTCCallkit)的典型应用场景为 1 对 1 呼叫场景,即用户 A 发起视频呼叫用户 B ,用户 B 同意呼叫,通话接通、两人进行实时音视频通信。

呼叫组件 UI kit 内部已包括了呼叫的相关逻辑,您只需要调用几行代码触发呼叫即可。

1 对 1 呼叫的业务流程如下:

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

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

  3. 用户 A 通过 startSingleCall 呼叫用户 B。

    // @param type:呼叫类型 1-音频呼叫,2-视频呼叫
    // @param callerAccId: 呼叫方 IM 账号 accid
    // @param calledAccId: 被叫方 IM 账号 accid
    CallParam param = CallParam.createSingleCallParam(2,"用户A accid","用户B accid");
    CallKitUI.startSingleCall(getActivity(), param);
    
  4. 用户 B 点击被叫页面的接听按钮进行视频通话。

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

进阶功能

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

此文档是否对你有帮助?
有帮助
我要吐槽
  • 注意事项
  • 基本概念
  • 开发环境
  • 准备工作
  • 示例项目源码
  • 集成呼叫组件
  • 步骤 1: 集成 NIM SDK
  • 步骤 2:初始化 NIM SDK
  • 步骤 3:实现登录 IM
  • 步骤 4: Gradle 引入呼叫组件
  • 步骤 5: 初始化呼叫组件 NERTCCallkit
  • 实现 1 对 1 呼叫(点对点呼叫)
  • 进阶功能