文档历史发放及记录

| **序号** | **变更（+/-）说明** | **作者** | **版本号** | **日期** | **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": "消息已推送" }      |

# 