泰康视频通话技术文档.md 18 KB

文档历史发放及记录

序号 变更(+/-)说明 作者 版本号 日期 se审核 se leader批准
1 新建 穆仙念 1.0.0 2023-6-2
2 变更

1 需求分析

原始需求文档:泰康视频通话

1.1 需求背景

该项目需要实现电视端与手机端的视频通话功能(电视和电视的通话场景暂不考虑),使用场景为养老院,使用对象为养老院工作人员(手机)和养老院老人(电视),目前只需要实现1对1的通话场景,不考虑多人通话的场景;

1.2 需求分析

1.2.1 需求列表

来电 接听、拒绝 1.焦点默认在【接听】按钮;2.焦点选中对应按钮,按【确认键】接听或是拒绝,【返回键】表示拒绝通话;3.拒绝通话后,弹窗消失;接听后进入通话界面;4.录制文案提示:当手机端发起录制申请时才在TV端来电页面显示,若手机端未发起录制申请,则不显示文案;5.在60S内未接听,弹窗消失,来电提醒结束;
拨打 挂断、开启/关闭摄像头、开启/关闭麦克风、开启/关闭美颜、大小屏幕切换 1.焦点默认在【挂断】按钮,按【确认键】表示挂断,挂断后,拨打界面消失;2.拨打过程中,多按钮默认显示【关闭麦克风】,【确认】键操作当前功能,左右键可选其他功能:开启/关闭摄像头、开启/关闭麦克风、开启/关闭美颜、大小屏幕切换;3.摄像头、麦克风、美颜默认开启,屏幕默认显示电视端当前视频画面;4.在60S内未接听,弹窗消失,拨打申请结束;
通话 挂断、开启/关闭摄像头、开启/关闭麦克风、开启/关闭美颜、大小屏幕切换 1.焦点默认在【挂断】按钮,按【确认键】表示挂断,挂断后,通话界面消失;2.通话过程中,多按钮默认显示【关闭麦克风】,【确认】键操作当前功能,左右键可选其他功能:开启/关闭摄像头、开启/关闭麦克风、开启/关闭美颜、大小屏幕切换;3.摄像头、麦克风、美颜默认开启,大屏幕默认显示对方视频画面,右上角小窗口默认显示电视端视频画面;大小屏切换后,大小屏幕的显示画面互换;
录制 同意/拒绝录制,录制标识 1.在通话过程中,手机端发起录制申请,电视端在通话界面出现【录制申请】弹窗;2.焦点默认在【同意】按钮,【确认】键表示开始录制,【录制申请】弹窗消失,同时左上角出现【录制中】标识,不显示录制时间,只显示通话时间;3.【不同意】表示拒绝录制,弹窗消失;4.电视端接收到录制申请后,便开始倒计时,在60S内若电视端不操作,那弹窗便自动消失;5.在录制过程中,若手机端取消了录制,那电视端toast:对方已结束录制服务;同时,【录制中】的标识消失;
功能操作 操作响应、toast 1.开启【美颜】的前提条件是摄像头已开,若摄像头未开,点击【开启美颜】时,toast:请先开启摄像头;(开启/关闭美颜的需求已删减)2.所有toast保持UI统一,显示3S后自动消失;
功能权限 来电提醒 在任何界面,来电通知弹窗都会显示在最上层
电视播放事件处理 若当前在视频/音频播放界面,来电提醒和通话时,需暂停/结束音视频播放
备选方案:技术上若没办法实现暂停,则在接听前让当前视频/音频播放事件强制退出
应用升级 支持自升级 终端应用接入开发者平台,必须支持自升级,可全量下发;升级条件:应用必须允许在后台时才允许升级,应用在前台运行时,不允许升级,避免闪退;

2 方案设计

2.1 系统流程图

2.3 功能设计

2.3.1 UI界面层

页面 功能
呼叫页面 提供拨打电话的页面
通话中 展示通话中的ui页面
自定义操作组件 提供切换摄像头,麦克风等等功能的通用组件

2.3.2 功能实现要点-应用层

其他 APP自更新 APP自更新
通话APP SDK登录 开机自动初始化 开机自启和初始化逻辑
自动登录和重试 1、自动登录 2、登录失败重试处理
接听 UI实现 1、是否云录制的显示状态 2、来电信息展示
接听和挂断逻辑 1、接听和拒绝逻辑 2、返回按键处理
倒计时自动断开 60秒没有接听自动挂断
UI组件 1、录制申请UI(接听)交互组件
2、通话配置UI交互组件 挂断、摄像头、mic、屏幕主从切换、美颜、状态提示
拨打 UI实现 1、显示当前摄像头预览画面/显示默认背景图 2、显示被呼叫人信息 3、状态切换UI和提示
麦克风状态切换 设置SDK对应方法
摄像头状态切换 设置SDK对应方法
美颜切换 设置SDK对应方法,需要检测摄像头是否开启
被呼叫人信息获取 通过腾讯SDK获取
挂断逻辑 使用SDK挂断
通话中 UI实现 1、通话时间显示 2、云录制状态显示 3、当前用户和对方用户视频流显示 4、状态切换UI和提示
麦克风切换和页面状态显示 1、调用SDK设置 2、显示提示信息,显示麦克风关闭状态
摄像头和页面状态显示 1、调用SDK设置 2、显示提示信息,显示摄像头关闭状态和背景图片
切换大小屏和页面状态显示 1、调用SDK设置 2、显示提示信息,交换视频预览位置和大小
通话时间 预留录制中的文案信息
通话状态监听并提示 1、主要监听网络状态并在页面提示 2、其他错误状态
通过过程中申请录制逻辑 1、显示申请对话框 2、调用SDK方法设置 3、对接自定义消息完成通讯
机型兼容 性能兼容和试图焦点 焦点在不同机器上表现不一样
异常处理 网络异常,通话异常和SDK抛出的异常信息处理
对接 协议定制和对接 协议定制和对接 1、通讯录信息获取 2、摄像头状态接口 3、自定义消息协议制定
自测联调 自测联调 1、主动呼叫测试 2、被动接听测试
风险提示 设备异常处理(摄像头/麦克风)

3 接口设计

3.1 提供给比利的接口协议

3.1.1 视频通话拉起的接口

val intent = Intent("com.tcl.ah.VIDEO_CALL")

//uid -- 被呼叫的用户名称 这里需要组装好数据,页面仅做展示 ---- 发起呼叫的用户名 这里需要组装好数据,页面仅做展示 ---- 扩展数据,养老云id

intent.putExtra("extra", "{"uid": "userid_xxx","username": "3#10-1004 苏文阿姨","caller": "3#11-1005 苏文大叔","center_id": "10000"}")

startActivity(intent)


3.1.2 摄像头检测

CameraManager.getCameraIdList() //获取可用摄像头列表

3.1.3 摄像头状态变更

import android.content.BroadcastReceiver

import android.content.Context

import android.content.Intent

import android.util.Log

class TclBroadcastReceiver : BroadcastReceiver() {

companion object {

const val ACTION_CAMERA_PLUG_IN = "android.intent.action.CAMERA_PLUG_IN"

const val ACTION_CAMERA_PLUG_OUT = "android.intent.action.CAMERA_PLUG_OUT"

}

override fun onReceive(context: Context, intent: Intent) {

when (intent.action) {

​ ACTION_CAMERA_PLUG_IN -> {

​ Log.e("TclBroadcastReceiver", "camera device plug in")

}

​ ACTION_CAMERA_PLUG_OUT -> {

​ Log.e("TclBroadcastReceiver", "camera device plug out")

}

else -> {

//other

}

}

}

}

val intentFilter = IntentFilter()

intentFilter.addAction(TclBroadcastReceiver.ACTION_CAMERA_PLUG_IN)

intentFilter.addAction(TclBroadcastReceiver.ACTION_CAMERA_PLUG_OUT)

registerReceiver(TclBroadcastReceiver(), intentFilter)

3.1.4 比利定时拉起TCL

try {

val intent = Intent("com.example.myapp.CUSTOM_ACTION")

intent.setPackage("com.tcl.ah.tkvideocall")

sendBroadcast(intent)

} catch (e: Throwable) {

}

3.2 服务端接口

3.2.1、环境

环境 APIGateway地址
⽣产(未发布) https://tktv.tkhealthcare.com
测试(已发布) https://tktv500.tkhealthcare.com

3.2.2、Header

字段名称 描述 作用
Content-Type 扩展名 固定值:"application/json; charset=utf-8"
AppId 调⽤⽅AppId,⽤以表明服务调⽤⽅⾝份信息 相当于当前系统名,代表服务调⽤⽅的⾝份信息,⽤于 鉴权对于第三章的⽹关鉴权来说, Key-auth 模式鉴权的key指的就是这个AppId basic-auth模式鉴权中的username值的就是AppId AppId为字符串 = 系统缩写 + "-" + 微服务名称,使⽤"- "作为间隔

3.2.3 API接口

3.2.3.1 发起呼叫

接口地址 [AIPGateway地址] /taikang/api/call/makeCall
请求⽅式 POST
参数列表 1. roomStr:腾讯通话建⽴的房间id 2. initiateUserId *发起通话的userId(居⺠居住房间电视sn号)*3. receiveUserId 接收通话的userId(管家) 4. centerId 养⽼云id(发起呼叫居⺠)
⼊参⽰例 { "roomStr":"1910654899", "initiateUserId":"initiateUserId", "receiveUserId":"receiveUserId", "centerId":"tk154785" }
出参示例 { "code": "0x0000", "msg": "ok", "data": null }

3.2.3.2 呼叫状态(接收呼叫、结束呼叫、取消呼叫、挂断呼叫)

接口地址 [AIPGateway地址] /taikang/api/call/callState
请求⽅式 POST
参数列表 1. roomStr:腾讯通话房间id 2. callStatus :通话状态 a. 已接听 :1 b. 已结束 :2 c. 已取消 :3 d. 已拒绝 :4 e. 未接听 :5(呼叫60s未接听)
⼊参⽰例 { "roomStr":"1910654899", "callStatus":"1" }
出参示例 { "code": "0x0000", "msg": "ok", "data": null }

3.2.4 自定义消息

目前定义为msgType 为 1代表录制申请相关

{

"msgType":1,
"content":{
  "sender":"TV/APP",
  "operation":"REJECT/AGREE/REQUEST/END",
  "username":"testUser"
}

}

3.2.5 居民取消通话和通话未被管家接听时的消息推送

接口地址 [AIPGateway地址] /taikang/api/call/pushMessage
请求⽅式 POST
参数列表 1. userId:管家/家医的腾讯UserId2. username :用户居住信息+姓名( 3#10-1004 苏文阿姨)
⼊参⽰例 { "userId":"weizy09@", "username":"3#10-1004 苏文阿姨" ,}
出参示例 { "code": "0x0000", "msg": "ok", "data": "消息已推送" }