文档历史发放及记录 | **序号** | **变更(+/-)说明** | **作者** | **版本号** | **日期** | **se审核** | **se leader批准** | | -------- | ------------------- | -------- | ---------- | -------- | ---------- | ----------------- | | 1 | 新建 | 穆仙念 | 1.0.0 | 2023-6-2 | | | | 2 | 变更 | | | | | | ## 1 需求分析 原始需求文档:[泰康视频通话](https://confluence.tclking.com/pages/viewpage.action?pageId=235444865) ### 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 系统流程图 ![工程TV组 > 泰康视频通话技术文档 > image2023-8-28_19-31-44.png](https://confluence.tclking.com/download/attachments/262668248/image2023-8-28_19-31-44.png?version=1&modificationDate=1693222867000&api=v2) ### 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](http://tktv.tkhealthcare.com) | | 测试(已发布) | https://[tktv500.tkhealthcare.com](http://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": "消息已推送" } | #