更新记录
4.8.2(2026-07-17) 下载此版本
New Features
- 支持在通话中通过 JS 选人页邀请新成员加***呼。
- 支持配置群呼邀请入口及邀请回调。
- 新增全局事件
onGroupRtcJoinSuccess,每次成功加入 RTC 房间后回调群呼 RTC 信息。 - 新增
currentGroupRtcInfo,用于查询当前群呼的callId、cid和selfRtcUid。 - 该接口和回调用于让业务方在群呼成功加入 RTC 房间后获取本次 RTC 入会信息。
Bug Fixes
- 修复 Android 群呼邀请页可能拉起失败的问题。
Compatibility
- 兼容 Android
CallKit4.8.2 版本 - 兼容 iOS
CallKit4.8.2 版本
4.8.0(2026-07-06) 下载此版本
Bug Fixes
- Android 修复群呼邀请离线用户后,被叫重新上线时偶现不弹起被呼叫画面的问题。
Compatibility
- 兼容 Android
CallKit4.8.0 版本 - 兼容 iOS
CallKit4.8.0 版本
4.7.5(2026-06-22) 下载此版本
[4.7.5] - 2026-06-17
New Features
- 新增
getCallInfo接口,支持获取当前通话信息(callId、通话类型、通话状态、主被叫、信令/rtc 频道信息等)。 - iOS 支持
enableAutoFloatingWindowWhenHome,开启后视频通话退后台自动启动应用外小窗(需在 Xcode 工程配置 Background Modes → Picture in Picture)。
Compatibility
- 兼容 Android
CallKit4.7.5 版本 - 兼容 iOS
CallKit4.7.5 版本
平台兼容性
| Android | Android CPU类型 | iOS |
|---|---|---|
| 适用版本区间:5.0 - 14.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | 适用版本区间:13 - 18 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
本文档介绍基于 Vue 框架(支持 Vue 2&Vue 3)快速集成网易云信 RTC 音视频通话点对点呼叫组件。
插件概述
网易云信音视频呼叫(呼叫组件 NECallKit)是网易云信推出的含 UI 组件,您只需要几行代码,就可以快速实现音视频呼叫,在 App 中添加包括呼叫、接通、拒接、以及通话中音频和视频的开关控制功能,并包含呼叫的 UI 界面。
呼叫组件基于云信信令、音视频通话 2.0 和 IM 即时通讯产品封装的融合性场景组件,简化了呼叫流程,将呼叫功能以 UI 组件化的形式提供给客户,提高接入效率、降低使用成本。
呼叫组件(NECallKit)支持的功能如下表所示。
功能 |
描述 |
|---|---|
| 音视频呼叫 | App 通过此功能通知被叫用户呼叫请求,呼叫请求类型包括音频和视频呼叫。 |
| 音视频通话 | 接通后可依照呼叫类型进行实时通话。 |
| 音视频控制 | 通话过程中可以控制本端音频或视频的开关,以及摄像头方向等。 |
| 话单 | 每次通话结束后都会收到对应的话单消息,标记本次通话是否接通以及通话时间、类型等数据。 |
限时优惠活动
如果您在 Dcloud 平台下载了该组件,您可登录云信控制台(Dcloud专属链接)进行开通与管理。
此外通过以上 Dcloud 平台的专属链接成功注册账号并开通服务的用户,云信将提供特别的优惠价,可在开通账号后联系云信销售或技术支持。
效果图
技术支持
| 网易云信提供多种服务,包括客服、技术支持、热线服务、全流程数据监控等,建议扫码添加我们的技术支持,协助接入、测试以及定制需求。 | 微信咨询 | 在线咨询 | 电话咨询 |
|---|---|---|---|
![]() |
点击在线咨询 | 4009-000-123 |
准备工作
1. 申请 AppKey
用户在使用本插件之前需要获取AppKey,AppKey 申请的具体流程请参见 创建应用并获取AppKey。
2. 获取账号
本插件使用中需要 account 和 token,具体请参见 注册云信IM账号。
3. 开通服务
使用音视频呼叫(呼叫组件)之前,需要开通部分能力,开通的具体流程请参见 开通服务。
4.开发环境
- HBuilderX
- sass(sass-loader 版本 <= 10.1.1)
- node(16.0.0 <= node 版本 <= 17.0.0, 推荐使用 Node.js 官方 LTS 版本 16.17.0)
- npm(版本请与 node 版本匹配)
快速接入
说明
本项目为App原生语言插件,请参考原生语言插件的集成方式进行集成。
步骤一:导入插件
- 购买 uni-app 原生插件 登录 uni 原生插件市场,并访问 netease-CallKit 插件,在插件详情页中购买(免费插件也可以在插件市场0元购)。购买后才能够云端打包使用插件。购买插件时请选择正确的 appid,以及绑定正确包名。
- 制作自定义调试基座 (请使用真机运行自定义基座) 购买插件后在项目的 manifest.json 页面的 App原生插件配置项下单击选择云端插件,选择netease-CallKit插件。
注意
- 自定义基座不是正式版,真正发布时,需要再打正式包。使用自定义基座是无法正常升级替换 APK 的。
- 请尽量不要使用本地插件,插件包超过自定义基座的限制,可能导致调试收费。
步骤二:在 vue 页面中引入原生插件
使用 uni.requireNativePlugin 的 API 在 vue 页面中引入原生插件,参数为插件的 ID。
var NECallKit = uni.requireNativePlugin("netease-CallKit")
const NECallKitEvent = uni.requireNativePlugin('globalEvent');
步骤三:初始化并登录组件
接口
login({params}, callback(ret))
params
appKey:
- 类型:String
- 描述:云信IM应用APPKEY,获取方式请参见 创建应用并获取AppKey。
account:
- 类型:String
- 描述:账号ID,获取方法请参见 注册云信IM账号。
token:
- 类型:String
- 描述:账号token,获取方法请参见 注册云信IM账号。
rtcUid:
- 类型:Number
- 描述:(可选值)云信 RTC Uid
apnsCername:
- 类型:String
- 描述:(可选值)云信 Apns 推送证书名
pkCername:
- 类型:String
- 描述:(可选值)云信 PushKit 推送证书名
language
- 类型:String
- 描述:(可选值)语言,zh为中文,en为英文,不填默认跟随系统
enableFloatingWindow
- 类型:布尔类型
- 描述:(可选值)是否开启悬浮窗,true开启,false不开启
enableAutoFloatingWindowWhenHome
- 类型:布尔类型
- 描述:(可选值)是否开启回到桌面自动开启悬浮窗,true开启,false不开启
- Android:按 Home 键回到桌面时,自动将通话界面收缩为系统悬浮窗
- iOS:App 退到后台时自动启用画中画(PiP),需在 Xcode 工程中配置
UIBackgroundModes包含audio和picture-in-picture
enableForegroundService
- 类型:布尔类型
- 描述:(可选值)是否开启前台服务,true开启,false不开启
enableAudio2Video
- 类型:布尔类型
- 描述:(可选值)是否显示语音转视频的按钮,true开启,false不开启,默认显示
enableVideo2Audio
- 类型:布尔类型
- 描述:(可选值)是否显示视频转语音的按钮,true开启,false不开启,默认显示
enableAudio2VideoConfirm
- 类型:布尔类型
- 描述:(可选值)是否开启语音转视频的时候需要同意,true开启,false不开启,默认不开启
enableVideo2AudioConfirm
- 类型:布尔类型
- 描述:(可选值)是否开启视频转语音的时候需要同意,true开启,false不开启,默认不开启
enableGroupCallInviteMembers
- 类型:布尔类型
- 描述:(可选值)是否显示群呼通话中邀请成员入口(
+),true 显示,false 不显示,默认不显示。开启后,群呼接通状态点击+会通过onGroupCallInviteMembersRequested事件交给 JS 自定义选人页处理。
callback(ret)
ret:
- 类型:JSON 对象
- 内部字段:
{
code:200, // number类型;失败登录返回 code(登录成功返回 200)
message:'' // String 类型;失败登录接口信息
}
示例代码
NECallKit.login({
appKey: AppConfig.appKey,
account: this.account,
token: this.currentToken,
rtcUid: this.rtcUid ? Number(this.rtcUid) : undefined,
apnsCername: this.apnsCername,
pkCername: this.pkCername,
language: this.language,
enableFloatingWindow: true,
enableAutoFloatingWindowWhenHome: true,
enableForegroundService: true,
enableAudio2Video: true,
enableVideo2Audio: true,
enableAudio2VideoConfirm: true,
enableVideo2AudioConfirm: true,
enableGroupCallInviteMembers: true
}, function(ret) {
if (ret.code != 200) {
var msg = '登录失败\n错误码:' + ret.code + '\n错误信息:' + ret.message;
uni.showToast({
title: msg,
icon: 'none',
})
} else {
uni.showToast({
title: '登录成功',
icon: 'none',
})
}
})
可用性
- iOS系统:可提供的 11 及更高版本
- Android系统:可提供的 21 及更高版本
步骤四:拨打通话
接口
toCallPage({params}, callback(ret))
params
accountList:
- 类型:string[]
- 描述:被叫账号列表,即 account 账号列表
type:
- 类型:number
- 描述:呼叫类型(1: 音频呼叫, 2: 视频呼叫)
rtcChannelName:
- 类型:String
- 描述:(可选值)云信 RTC 频道名称
isGroupCall:
- 类型:布尔类型
- 描述:(可选值)是否为群组呼叫,true为群组呼叫,false为点对点呼叫,默认为false
needPush:
- 类型:布尔类型
- 描述:(可选值)是否需要推送,true需要推送,false不需要推送,默认为false
pushContent:
- 类型:String
- 描述:(可选值)推送内容,当needPush为true时生效
pushPayload:
- 类型:String 或 Object(内容为json结构)
- 描述:(可选值)推送载荷,当needPush为true时生效,用于传递自定义推送数据
callback(ret)
ret:
- 类型:JSON 对象
- 内部字段:
{
code:200, // number类型;错误码(呼叫成功返回 200)
message:'' // String 类型;错误信息(呼叫接口信息)
}
示例代码
点对点呼叫示例:
NECallKit.toCallPage({
accountList: ['123456'],
type: 2 // 2: 视频呼叫, 1: 音频呼叫
}, function(ret) {
if (ret.code != 200) {
var msg = '呼叫失败\n错误码:' + ret.code + '\n错误信息:' + ret.message;
uni.showToast({
title: msg,
icon: 'none',
})
} else {
uni.showToast({
title: '呼叫成功',
icon: 'none',
})
}
})
多人呼叫示例(包含推送配置):
NECallKit.toCallPage({
accountList: ['123456', '654321', '789012'],
isGroupCall: true,
type: 2, // 2: 视频呼叫, 1: 音频呼叫
rtcChannelName: this.rtcChannelName || undefined,
// push settings
needPush: (getApp().globalData && getApp().globalData.multiCallSettings && typeof getApp().globalData.multiCallSettings.needPush === 'boolean') ? getApp().globalData.multiCallSettings.needPush : false,
pushContent: (getApp().globalData && getApp().globalData.multiCallSettings && getApp().globalData.multiCallSettings.pushContent) || undefined,
pushPayload: (getApp().globalData && getApp().globalData.multiCallSettings && getApp().globalData.multiCallSettings.pushPayload) || undefined
}, function(ret) {
if (ret.code != 200) {
var msg = '多人视频呼叫失败\n错误码:' + ret.code + '\n错误信息:' + ret.message;
uni.showToast({
title: msg,
icon: 'none',
})
} else {
uni.showToast({
title: '多人视频呼叫成功',
icon: 'success',
})
}
})
可用性
- iOS系统:可提供的 11 及更高版本
- Android系统:可提供的 21 及更高版本
步骤五:更多特性
一、登出
NECallKit.logout({}, (ret) => {
if (ret.code != 200) {
uni.showToast({
title: '登出失败 ' + ret.code,
icon: 'none',
})
} else {
uni.showToast({
title: '登出成功 ',
icon: 'none',
})
}
})
二、设置降噪
NECallKit.setAINSMode({
rtcAINSMode: 1 // number类型;0:关闭;1:开启(正常模式);2:开启(加强模式)
}, (ret) => {
if (ret.code != 200) {
var msg = '设置失败\n错误码:' + ret.code + '\n错误信息:' + ret.message;
uni.showToast({
title: msg,
icon: "none"
})
} else {
uni.showToast({
title: '设置成功',
icon: "success"
})
}
})
三、获取当前通话信息
接口
getCallInfo({params}, callback(ret))
params
无必填参数,当前保留 {} 作为扩展参数。
callback(ret)
ret:
- 类型:JSON 对象
- 内部字段:
{
code: 200,
message: 'success',
callInfo: {
callId: 'call-id',
currentAccount: 'alice',
currentAccId: 'alice',
callType: 2,
callStatus: 3,
callerInfo: {
accId: 'alice',
uid: 1001,
isMuteAudio: false, // Android 返回
isMuteVideo: false // Android 返回
},
calleeInfo: {
accId: 'bob',
uid: 1002,
isMuteAudio: false, // Android 返回
isMuteVideo: false // Android 返回
},
signalInfo: {
channelId: 'signal-channel-id',
requestId: 'request-id',
channelName: 'signal-channel-name',
extraInfo: '',
globalExtraCopy: ''
},
rtcInfo: {
channelId: 123,
channelName: 'rtc-channel-name',
token: 'rtc-token',
cid: 456
}
}
}
空闲态、未初始化或当前无通话时,code 仍返回 200,callInfo 返回 null。
callInfo 字段
| 字段 | 类型 | 描述 |
|---|---|---|
| callId | String | 当前通话唯一 ID |
| currentAccount | String | 当前登录账号,与 currentAccId 一致 |
| currentAccId | String | 当前登录账号 |
| callType | Number | 通话类型,1 为音频,2 为视频 |
| callStatus | Number | 当前通话状态 |
| callerInfo | Object | 主叫用户信息 |
| callerInfo.accId | String | 主叫 IM 账号 |
| callerInfo.uid | Number | 主叫 RTC uid |
| callerInfo.isMuteAudio | Boolean | 主叫音频是否静音,Android 支持返回 |
| callerInfo.isMuteVideo | Boolean | 主叫视频是否关闭,Android 支持返回 |
| calleeInfo | Object | 被叫用户信息 |
| calleeInfo.accId | String | 被叫 IM 账号 |
| calleeInfo.uid | Number | 被叫 RTC uid |
| calleeInfo.isMuteAudio | Boolean | 被叫音频是否静音,Android 支持返回 |
| calleeInfo.isMuteVideo | Boolean | 被叫视频是否关闭,Android 支持返回 |
| signalInfo | Object | 信令信息 |
| signalInfo.channelId | String | 信令频道 ID |
| signalInfo.requestId | String | 信令邀请唯一标识 |
| signalInfo.channelName | String | 信令通道名称 |
| signalInfo.extraInfo | String | 透传扩展信息 |
| signalInfo.globalExtraCopy | String | 全局抄送扩展信息 |
| rtcInfo | Object | RTC 频道信息 |
| rtcInfo.channelId | Number | RTC 频道 ID |
| rtcInfo.channelName | String | RTC 频道名 |
| rtcInfo.token | String | RTC 进房 token |
| rtcInfo.cid | Number | RTC cid,iOS 支持返回,Android 可能不返回 |
Android 和 iOS 均返回当前 native
NECallInfo可提供的公开字段;Android 的NEUserInfo包含isMuteAudio、isMuteVideo,iOS 当前NEUserInfo仅包含accId、uid。
示例代码
NECallKit.getCallInfo({}, function(ret) {
console.log('getCallInfo ' + JSON.stringify(ret));
if (ret.code === 200 && ret.callInfo) {
uni.showToast({
title: '当前通话:' + ret.callInfo.callId,
icon: 'none'
})
} else {
uni.showToast({
title: '当前无通话信息',
icon: 'none'
})
}
})
可用性
- iOS 系统:11 及更高版本
- Android 系统:21 及更高版本
四、开启/关闭来电横幅
来电横幅功能开启后,收到来电时将在屏幕顶部以横幅形式展示,用户无需离开当前页面即可接听或拒绝来电。
接口
enableIncomingBanner({params})
params
enable:
- 类型:布尔类型
- 描述:是否开启来电横幅,true 开启,false 关闭
示例代码
NECallKit.enableIncomingBanner({ enable: true });
可用性
- iOS 系统:11 及更高版本
- Android 系统:21 及更高版本
五、群呼通话中邀请成员
群呼接通后,native 通话页面会显示邀请入口(+)。用户点击 + 后,组件不会展示 native 通讯录或输入框,而是通过 JS 事件把“需要选择邀请成员”的请求抛给业务层。业务层可以使用自己的通讯录、组织架构、好友列表或自定义输入页完成选人,然后调用回传接口把账号列表交还给 native,native 会继续执行当前群呼的邀请流程。
说明:
- 该能力仅用于“已在群呼通话中继续邀请新成员”,不改变
toCallPage发起新通话的语义。- 该能力默认关闭,需要在
NECallKit.login中传入enableGroupCallInviteMembers: true后才显示+入口。- JS 侧不感知
callId、groupId等 native 内部上下文,只需要处理requestId和账号列表。- 业务自定义 UI 属于接入方页面能力,可完全由 JS 实现。
接入流程
- 在全局入口(例如
App.vue)监听onGroupCallInviteMembersRequested。 - 收到事件后保存
requestId和inCallUsers,跳转到业务自定义选人页面。 - 选人页面展示自定义 UI,并过滤
inCallUsers中已在通话内的账号。 - iOS 自定义选人页需要展示到最上层时,调用
dismissGroupCallView临时让出 native 群呼全屏视图。 - 用户确认或取消时调用
replyGroupCallInviteMembers。 - native 收到回包后恢复通话页,并继续邀请或取消本次邀请。
Android 接入说明
Android 端点击 native 群呼页面 + 后,会进入 CallUIKit 的 contactSelector 回调。插件内部会:
- 生成一次性
requestId。 - 记录当前 pending 请求和 CallUIKit observer。
- 将 uni-app 宿主页拉到前台。
- 触发
onGroupCallInviteMembersRequested事件给 JS。 - pending 期间避免 native 群呼 Activity 抢回前台。
- JS 回传后恢复群呼 Activity,并把过滤后的账号列表交给 CallUIKit 继续邀请。
Android 接入方只需要实现 JS 监听和回传,不需要调用额外 Android 专属接口。
iOS 接入说明
iOS 端点击 native 群呼页面 + 后,会进入 NECallUIKitDelegate 的 inviteUsersWithCallId:inCallUsers:completion: 回调。插件内部会:
- 生成一次性
requestId。 - 记录当前 pending 请求和 CallUIKit completion。
- 触发
onGroupCallInviteMembersRequested事件给 JS。 - 等 JS 页面调用
dismissGroupCallView后,临时降低 CallUIKit 全屏 window 层级,使 JS 自定义选人页显示在上层。 - JS 回传后恢复 CallUIKit window,并把过滤后的账号列表交给 CallUIKit 继续邀请。
iOS 接入方在自定义选人页需要显示到最上层时调用 dismissGroupCallView。为保证双端代码一致,建议使用 typeof 判断后调用;Android 不实现该方法时会自动跳过。
事件:onGroupCallInviteMembersRequested
native + 被点击后触发该事件。
const NECallKitEvent = uni.requireNativePlugin('globalEvent');
NECallKitEvent.addEventListener('onGroupCallInviteMembersRequested', function(e) {
console.log('onGroupCallInviteMembersRequested ' + JSON.stringify(e));
});
事件参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| requestId | String | 是 | 本次选择请求唯一 ID。调用回传接口时必须原样带回。 |
| inCallUsers | Array |
是 | 当前已在通话内的账号列表。业务选人页应过滤这些账号,避免重复邀请。 |
示例:
NECallKitEvent.addEventListener('onGroupCallInviteMembersRequested', function(e) {
const requestId = e && e.requestId;
const inCallUsers = Array.isArray(e && e.inCallUsers) ? e.inCallUsers : [];
if (!requestId) return;
const app = getApp();
if (!app.globalData) app.globalData = {};
app.globalData.groupCallInviteRequest = {
requestId: requestId,
inCallUsers: inCallUsers
};
uni.navigateTo({
url: '/pages/group-invite/group-invite?requestId=' + encodeURIComponent(requestId),
fail: function() {
NECallKit.replyGroupCallInviteMembers({
requestId: requestId,
accountList: [],
cancelled: true
});
}
});
});
接口:replyGroupCallInviteMembers
JS 选择完成或取消后调用,用于把结果回传给 native。
NECallKit.replyGroupCallInviteMembers({params}, callback(ret))
params:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| requestId | String | 是 | onGroupCallInviteMembersRequested 中收到的请求 ID,必须原样带回。 |
| accountList | Array |
否 | 要邀请的新增账号列表。cancelled 为 true 时可传空数组。 |
| cancelled | Boolean | 否 | 是否取消本次选择。true 表示取消,native 不发起邀请;默认 false。 |
callback(ret):
| 字段 | 类型 | 说明 |
|---|---|---|
| code | Number | 200 表示 native 已接收并处理本次回传。 |
| message | String | 处理结果描述。 |
| requestId | String | 本次处理的请求 ID。 |
| acceptedAccountList | Array |
native 过滤后实际交给 CallUIKit 的账号列表。 |
native 会兜底过滤以下账号:
- 空账号
- 当前登录账号
- 已在通话内账号
- 重复账号
示例:
NECallKit.replyGroupCallInviteMembers({
requestId: requestId,
accountList: ['user1', 'user2'],
cancelled: false
}, function(ret) {
console.log('replyGroupCallInviteMembers ' + JSON.stringify(ret));
if (!ret || ret.code !== 200) {
uni.showToast({
title: '邀请成员失败:' + ((ret && ret.message) || ''),
icon: 'none'
});
}
});
取消示例:
NECallKit.replyGroupCallInviteMembers({
requestId: requestId,
accountList: [],
cancelled: true
});
接口:dismissGroupCallView
iOS 专用。JS 自定义选人页面需要显示到最上层时调用,用于临时让出 native 群呼全屏视图。该方法不会挂断或结束当前群呼;native 会在 replyGroupCallInviteMembers 回传、请求超时或通话结束后恢复通话视图。
NECallKit.dismissGroupCallView({params}, callback(ret))
params:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| requestId | String | 是 | onGroupCallInviteMembersRequested 中收到的请求 ID。 |
callback(ret):
| 字段 | 类型 | 说明 |
|---|---|---|
| code | Number | 200 表示处理成功。 |
| message | String | 处理结果描述。 |
| requestId | String | 本次处理的请求 ID。 |
推荐写法:
onReady() {
if (!this.requestId || !NECallKit || typeof NECallKit.dismissGroupCallView !== 'function') {
return;
}
this.$nextTick(() => {
setTimeout(() => {
NECallKit.dismissGroupCallView({
requestId: this.requestId
}, function(ret) {
console.log('dismissGroupCallView ' + JSON.stringify(ret));
});
}, 500);
});
}
完整选人页回传示例
export default {
data() {
return {
requestId: '',
inCallUsers: [],
accountInput: '',
submitted: false
};
},
onLoad(options) {
this.requestId = options && options.requestId ? decodeURIComponent(options.requestId) : '';
const pending = getApp().globalData && getApp().globalData.groupCallInviteRequest;
this.inCallUsers = pending && Array.isArray(pending.inCallUsers) ? pending.inCallUsers : [];
},
onUnload() {
if (!this.submitted && this.requestId) {
this.replyInvite([], true);
}
},
methods: {
selectedAccounts() {
const inCallUsers = this.inCallUsers || [];
return (this.accountInput || '')
.split(/[,,\s]+/)
.map(account => account.trim())
.filter(account => account.length > 0)
.filter((account, index, accounts) => accounts.indexOf(account) === index)
.filter(account => inCallUsers.indexOf(account) === -1);
},
confirmInvite() {
this.replyInvite(this.selectedAccounts(), false);
},
cancelInvite() {
this.replyInvite([], true);
},
replyInvite(accountList, cancelled) {
if (this.submitted) return;
this.submitted = true;
NECallKit.replyGroupCallInviteMembers({
requestId: this.requestId,
accountList: accountList || [],
cancelled: !!cancelled
}, function() {
uni.navigateBack();
});
}
}
}
可用性
- iOS 系统:11 及更高版本
- Android 系统:21 及更高版本
六、通话状态监听
如果您的业务需要 监听通话的状态,例如:异常、通话开始、结束等,可以监听以下事件:
//接收到邀请
// e.callType 呼叫类型,1: 语音呼叫;2: 视频呼叫
// e.callerAccount 呼叫账号
NECallKitEvent.addEventListener('onReceiveInvited', function(e) {
console.log('onReceiveInvited' + JSON.stringify(e));
});
//通话建立
// e.callType 呼叫类型,1: 语音呼叫;2: 视频呼叫
// e.callId 通话Id
// e.callerAccount 呼叫账号
// e.calledAccount 被呼账号
// e.currentAccount 当前账号
NECallKitEvent.addEventListener('onCallConnected', function(e) {
console.log('onCallConnected' + JSON.stringify(e));
});
//通话类型变更
// e.callType 呼叫类型,1: 语音呼叫;2: 视频呼叫
NECallKitEvent.addEventListener('onCallTypeChange', function(e) {
console.log('onCallTypeChange' + JSON.stringify(e));
});
//通话结束
// e.code 错误码
// (code:12 手动取消;code:2 超时取消;code:14 对方拒接通话;code:15 接听并自己结束通话;code:16 接听并对方结束通话)
// e.message 错误信息
NECallKitEvent.addEventListener('onCallEnd', function(e) {
console.log('onCallEnd' + JSON.stringify(e));
});
// 远端用户是否开启视频流采集
// e.account 账号
// e.mute 是否静音
NECallKitEvent.addEventListener('onVideoMuted', function(e) {
console.log('onVideoMuted' + JSON.stringify(e));
});
// 远端用户是否开启音频流采集
// e.account 账号
// e.mute 是否静音
NECallKitEvent.addEventListener('onAudioMuted', function(e) {
console.log('onAudioMuted' + JSON.stringify(e));
});
常见问题
1、iOS需要配置麦克风和摄像头权限
需要在项目根目录的manifest.json中的“App权限配置”中配置麦克风和摄像头权限
2、同时集成呼叫组件和推送插件后无法正常呼叫
需要在控制台开通IM的多端登录
3、iOS 画中画(退后台自动悬浮窗)不生效
如果需要开启 enableAutoFloatingWindowWhenHome 功能,iOS 端需要在 Xcode 工程中配置后台模式:
- 在
Info.plist的UIBackgroundModes中添加audio和picture-in-picture - 使用 uni-app 自定义基座调试时,可在 HBuilder-Hello 工程的 Capabilities 中勾选 "Audio, AirPlay, and Picture in Picture"

收藏人数:
https://github.com/netease-kit/NECallKit/tree/main/uni-app
购买(
下载 for 离线打包
使用 HBuilderX 导入示例项目
下载示例项目ZIP
赞赏(5)

下载 3709
赞赏 2
赞赏 1
赞赏
京公网安备:11010802035340号