Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >小程序Calling 全局监听实现思路和解决方案

小程序Calling 全局监听实现思路和解决方案

原创
作者头像
良人
修改于 2022-01-28 18:00:57
修改于 2022-01-28 18:00:57
2.4K3
举报

说明

本demo是基于腾讯云calling小程序修改了相关逻辑来实现全局监听,在收到邀请信令后跳转到指定页面(该页面注册了TUICalling组件)进行组件初始化,使用前建议先了解官网demo的相关文档,这里就不多做说明,如果觉得这篇文章对你有帮助麻烦点个赞!

全局监听效果展示

接听.gif
接听.gif
挂断.gif
挂断.gif

基于calling组件的修改说明

全局监听的实现思路就是在原有calling组件的基础上将信令放到了app.js文件,并在appLaunch实现邀请信令的监听,监听到邀请事件后处理邀请事件,并且把需要的参数设置为globalData方便取的时候获取,然后跳转页面初始化组件处理邀请事件,此外由于邀请没有走TRTCDelegate,所以挂断事件也是用信令单独处理的,由于时间比较催促,所以本demo仅提供思路和参考

思维导图

修改思路.png
修改思路.png

项目demo GitHub地址传送门

修改点部分代码

  1. app.js 引入信令相关文件
代码语言:txt
AI代码解释
复制
import TSignaling from './components/TUICalling/TRTCCalling/node\_module/tsignaling-wx'

import TSignalingClient from './components/TUICalling/TRTCCalling/TSignalingClient'

import TIM from './components/TUICalling/TRTCCalling/node\_module/tim-wx-sdk'

import { CALL\_STATUS } from './components/TUICalling/TRTCCalling/common/constants'
  1. 设置需要的全局参数
代码语言:txt
AI代码解释
复制
      userInfo: null,

      headerHeight: 0,

      statusBarHeight: 0,

      sdkAppID: Signature.sdkAppID,

      userID: '',

      userSig: '',

      token: '',

      expiresIn: '',

      phone: '',

      sessionID: '',

      callStatus: CALL\_STATUS.IDLE, // 用户当前的通话状态

      callType: 1,

      callEvent: null,

      inviteId: '',

      inviteID: '',

      inviter: '',

      roomID: '',

      isSponsor: false,

      \_connectUserIDList: [],

      \_isGroupCall: false,

      \_groupID: '',

      \_unHandledInviteeList: [],

      inviteData: null,

      inviteeList: []
  1. 信令初始化和监听
代码语言:txt
AI代码解释
复制
    wx.$TIM = TIM.create({SDKAppID: Signature.sdkAppID})

    wx.$TSignaling = new TSignaling({SDKAppID: Signature.sdkAppID, tim: wx.$TIM})

    wx.TSignalingClient = new TSignalingClient({ TSignaling: wx.$TSignaling })

      // 新的邀请回调事件

      wx.$TSignaling.on(TSignaling.EVENT.NEW\_INVITATION\_RECEIVED, this.handleNewInvitationReceived, this);

      // SDK Ready 回调

      wx.$TSignaling.on(TSignaling.EVENT.SDK\_READY, this.handleSDKReady, this);

      // 被踢下线

      wx.$TSignaling.on(TSignaling.EVENT.KICKED\_OUT, this.handleKickedOut, this);
  1. 邀请事件处理
代码语言:txt
AI代码解释
复制
 handleNewInvitationReceived(event) {

    console.log(TAG\_NAME, 'onNewInvitationReceived', event);

    const { data: { inviter, inviteeList, data, inviteID, groupID } } = event

    const inviteData = JSON.parse(data)

    wx.$globalData.inviteData = inviteData

    wx.$globalData.inviteeList = inviteeList

    // 此处判断inviteeList.length 大于2,用于在非群组下多人通话判断

    // userIDs 为同步 native 在使用无 groupID 群聊时的判断依据

    const isGroupCall = groupID || inviteeList.length >= 2 || inviteData.data && inviteData.data.userIDs && inviteData.data.userIDs.length >= 2 ? true : false

    let callEnd = false

    // 此处逻辑用于通话结束时发出的invite信令

    // 群通话已结束时,room\_id 不存在或者 call\_end 为 0

    if (isGroupCall && (!inviteData.room\_id || (inviteData.call\_end && inviteData.call\_end === 0))) {

      callEnd = true

    }

    // 1v1通话挂断时,通知对端的通话结束和通话时长

    if (!isGroupCall && inviteData.call\_end >= 0) {

      callEnd = true

    }

    if(callEnd) {

      return

    }

    if(wx.$globalData.callStatus === CALL\_STATUS.CALLING || wx.$globalData.callStatus === CALL\_STATUS.CONNECTED) {

      wx.$TSignaling.reject({ inviteID, type: data.call\_type, lineBusy: 'line\_busy' })

      return

    }

    const callInfo = {

      \_isGroupCall: !!isGroupCall,

      \_groupID: groupID || '',

      \_unHandledInviteeList: [...inviteeList, inviter],

    }

    if (isGroupCall && !groupID) {

      callInfo.\_unHandledInviteeList = [...inviteData.data.userIDs]

    }

    wx.$globalData.callStatus = CALL\_STATUS.CALLING

    wx.$globalData.callType = inviteData.call\_type

    wx.$globalData.inviteID = inviteID

    wx.$globalData.inviter= inviter

    wx.$globalData.roomID = inviteData.room\_id

    wx.$globalData.isSponsor = false

    wx.$globalData.\_connectUserIDList = [inviter]

    wx.$globalData.\_isGroupCall = callInfo.\_isGroupCall

    wx.$globalData.\_groupID = callInfo.\_groupID

    wx.$globalData.\_unHandledInviteeList = callInfo.\_unHandledInviteeList

    wx.$globalData.callEvent = event

    wx.navigateTo({

      url: '/pages/calling/calling', // 需要跳转的页面

    })

  }
  1. 跳转的页面引入 TUICalling 组件
代码语言:txt
AI代码解释
复制
    <TUICalling

    id="TUICalling-component"

    config="{{config}}"

  ></TUICalling>
  1. 指定页面onLoad方法进行组件初始化和处理
代码语言:txt
AI代码解释
复制
   const config = {

      sdkAppID: wx.$globalData.sdkAppID,

      userID: wx.$globalData.userID,

      userSig: wx.$globalData.userSig

      }

      this.setData({

      config: { ...this.data.config, ...config },

      }, () => {

      this.TUICalling = this.selectComponent('#TUICalling-component')

      this.TUICalling.init()

      wx.$globalData.callStatus === CALL\_STATUS.CALLING && this.TUICalling.handleNewInvitationReceived(wx.$globalData.callEvent)

      }) 
  1. TUICalling.js 邀请事件处理
代码语言:txt
AI代码解释
复制
 // 新的邀请回调事件

    handleNewInvitationReceived(event) {

      console.log(`${TAG\_NAME}, handleNewInvitationReceived`, event)

      this.data.config.type = wx.$globalData.callType

      this.getUserProfile([event.data.inviter || event.data.sponsor])

      this.setData({

        config: this.data.config,

        callStatus: 'calling',

        isSponsor: false,

      })

    }
  1. 作为邀请方挂断处理
代码语言:txt
AI代码解释
复制
    /\*\*

     \* 当您作为被邀请方收到的回调时,可以调用该函数拒绝来电

     \*/

    async reject() {

      console.log(`${TAG\_NAME}, reject`)

      const inviteID = wx.$globalData.inviteID

      const data = wx.$globalData.callEvent.data

      wx.$TSignaling.reject({

        inviteID,

        data: JSON.stringify(data)

      }).then(res => {

        this.triggerEvent('sendMessage', {

          message: res.data.message,

        })

      })

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
3 条评论
热度
最新
挂断事件怎么处理,挂断之后再呼叫就呼叫不了了
挂断事件怎么处理,挂断之后再呼叫就呼叫不了了
回复回复点赞举报
6666
6666
回复回复点赞举报
6666666666
6666666666
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
新一代音视频沟通利器 —— TRTCCalling
什么是TRTCCalling? TRTCCalling 是在 TRTC 和 TIM 的基础上诞生的一款快速集成的音视频的解决方案。支持1v1和多人视频/语音通话。 calling 可以做什么? 在线客服、在线面试、企业在线沟通、在线问诊、音视频社交等。 | 体验地址 | https://web.sdk.qcloud.com/component/trtccalling/demo/web/latest/index.html#/login 如何接入? 步骤1:集成 TRTCCa
腾讯云音视频
2021/10/18
1.9K0
TRTC Android端开发接入学习之实现语音通话(六)
在上一篇《视频通话》中,我们实现了双方的视频通话,总所周知没有声音再好的戏也出不来,本期我们来学习如何使用TRTC完成语音通话的功能。
腾讯云-hongyang
2020/09/09
1.5K0
【实时音视频TRTC】音视频互动解决方案,跨平台、小程序、低代码深度合作!
腾讯云音视频,涵盖音视频通信基础网络 RT-ONE,云直播、实时音视频 TRTC、即时通信 IM、云点播等音视频 PaaS 产品,提供音视频一站式解决方案。
TCS-F
2021/09/29
1.5K0
【实时音视频TRTC】音视频互动解决方案,跨平台、小程序、低代码深度合作!
TRTC Android端开发接入学习之实现语音聊天室(九)
多人语音是音视频通话的常见应用场景之一,TRTC对着这方面的支持必不可少,本次我们学习如何使用TRTC快速开发语音聊天室功能。
腾讯云-hongyang
2020/09/18
1.9K0
微信小程序TRTC使用custom自定义面板(实现篇)
本文主要是使用 custom 面板实现直播互动,上下麦操作。如有疑问可参考 微信小程序TRTC使用custom自定义面板(理解篇)。本文只是简单演示如何实现主播与观众进行连麦互动,在实际中,通常是有主播端发起与粉丝进行直播互动,通过粉丝来接受,进行连麦。发送这种消息可以使用IM(即时通讯)完成。
yuliang
2021/03/16
1.4K0
从零开始创建一个超简单的TRTC音视频通讯程序(小程序篇)
出于政策和合规的考虑,微信暂未放开所有小程序对实时音视频功能(即 <live-pusher> 和 <live-player> 标签)的支持:
F颜
2020/06/18
2.2K0
iOS音视频接入 - TRTC多人音视频通话
前一篇我们使用腾讯封装的TRTCCalling接入了1v1的音视频通话,今天还是使用此模块进行实现多人音视频通话及其常用TRTCSDK的API。
小明同学接音视频
2020/10/13
4.2K0
iOS音视频接入 - TRTC多人音视频通话
iOS音视频接入- TRTC语音聊天室
我们在之前的文章中已经了解了TRTC的1v1和多人语音聊天,本篇文章来了解下TRTC的语音聊天室。
小明同学接音视频
2020/10/16
3.6K0
TRTC Android端开发接入学习之实现视频通话(五)
经过上一篇《屏幕分享》功能的实践,我们知道了如何使用官方提供的功DEMO,快速开发。今天我们来尝试使用官方提供的组件和自定义的UI实现功能。
腾讯云-hongyang
2020/09/04
2.8K0
TRTC Android端开发接入学习之实现视频通话(五)
打通小程序音视频和webRTC
2017年腾讯视频云团队跟微信团队联合,将视频云 SDK 跟微信小程序整合在一起,并开放内部功能。
腾讯视频云终端团队
2018/05/03
19.4K14
打通小程序音视频和webRTC
通过修改样式调整trtccalling 视图
总体思路就是通过添加点击事件,给流播放节点动态添加样式,来实现视角切换。拿web 端 Demo来举例就是,通过点击,修改flex来实现两个dom的切换。
良人
2022/03/25
3640
产品动态 | 音视频通话解决方案 -- TUICalling(小程序篇)
什么是TUICalling TUICalling 是一个开源的组件, 是在 TRTC 和 IM 的基础上诞生的一款快速集成音视频功能解决方案。支持1v1和多人视频/语音通话。 TUICalling 的优势 TUICalling 是以 TRTCCalling 为基础封装的音视频通信组件,相比较原有的 TRTCCalling有以下区别和优势: UI与逻辑分离初始化修改UI样式TUI Calling分离简单 (只需要init)简单 (UI独立处理)TRTC Calling未分离较复杂 (1.
腾讯云音视频
2022/01/10
1.7K0
最佳实践 | 基于TRTCCalling快速实现多人音视频通话
TRTCCalling SDK 基于TRTC和TSignaling ,封装了简单易用的 API,接入后可快速实现web和native互通的1v1或群实时通话。 效果展示 群视频通话 语音通话 在线体验 https://web.sdk.qcloud.com/im/demo/latest/index.html 1)注册登录后,创建一个 IM 的群组,拉上其他人入群,打开会话窗口,点击实时音视频选择(语音通话或者视频通话)。 2)选择呼叫用户列表,单击【确定】,就可以发起实时通话了。 3)呼
腾讯云音视频
2021/06/07
3.5K0
微信小程序使用TRTC
在使用之前我们需要了解 <live-player> 和 <live-pusher> 微信小程序原生组件,因为小程序TRTC组件标签 <trtc-room> 是基于这两个标签实现的组件,所以在运行调试时开发工具是不支持的,只能在真机上运行。
yuliang
2021/03/10
3K0
实时音视频 TRTC 常见问题汇总---小程序篇
如有更多需求,或希望深度合作,可以 提交工单 或致电4009100100联系我们。
腾讯视频云-Zachary
2021/09/21
5.9K0
实时音视频 TRTC 常见问题汇总---小程序篇
WebRTC实现p2p视频通话
简介 目的 帮助自己了解webrtc 实现端对端通信 # 使用流程 git clone https://gitee.com/wjj0720/webrtc.git cd ./webRTC npm i npm run dev # 访问 127.0.0.1:3003/test-1.html 演示h5媒体流捕获 # 访问 127.0.0.1:3003/local.html 演示rtc 本地传输 # 访问 127.0.0.1:3003/p2p.html 演示局域网端对端视屏
random_wang
2019/10/22
7.1K0
WebRTC实现p2p视频通话
实时音视频开发学习11 - 小程序端二
小程序实现过程就不按照web端一步步拆分代码,而是直接讲解业务内容。核心内容可以参考trtc—room相关的API,本章内容会讲述大部分内容。地址:
金林学音视频
2020/08/28
1.4K0
实时音视频开发学习11 - 小程序端二
沉浸式搭建微信同款音视频通话之全流程(基操细节) | 技术创作特训营第二期
摘要:腾讯云音视频通话SDK不仅支持iOS、Android、Web、小程序、Flutter、uni-app等平台全球互通,而且还支持标清、高清、超高清等多种画质,提供微信视频聊天同款 UI 组件快速集成方案,仅需3步,最快一天即可完成集成上线,配合低延时高质量的音视频服务,轻松应对语聊、客服、医疗通信等场景需求,帮助开发者快速搭建稳定可靠的音视频通话应用。
三掌柜
2023/10/15
1.4K7
沉浸式搭建微信同款音视频通话之全流程(基操细节) | 技术创作特训营第二期
TRTC学习之旅(二)-- 使用vue+ts集成TRTC实现多人会议室
根据上回学习了官方TRTC demo之后,已经了解了一个基础的多人会议室创建的流程,接下来我需要将自己学到的转换为自己能够运用的。
黑眼圈云豆
2020/06/24
4K3
TRTC学习之旅(二)--  使用vue+ts集成TRTC实现多人会议室
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
在上一篇博文 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(上) 中,主要介绍了关于 WebRTC 的基本理论,那么这篇文章我们将进入实战阶段,通过 WebRTC 框架,去实现 P2P 通话,以及延伸到一对多的音视频通话,从而实现在线监考功能;
sidiot
2023/08/31
5000
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
推荐阅读
相关推荐
新一代音视频沟通利器 —— TRTCCalling
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档