Files
jiecheng-business/盛阳等三方支付EPG传参App开发需求.md
zhaogd d11464d466 基线备份:thirdparty 变体完成 + Android 4.2 兼容改造前
包含内容:
- thirdparty flavor 独立 applicationId + Intent 入口(ThirdPartyEntryActivity)
- 58 后端接口适配(单 /api 路径、code 0/200、camelCase 字段、UNBOUND 轮询)
- MAC 硬件锚定校验(防一凭证多设备共用)
- EPG mac 覆盖 SDK init(sMacOverride)+ ChannelManger 初始化对齐
- 提示文案优化(设备未注册/权益未绑定)
2026-08-25 11:16:40 +08:00

244 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 盛阳等三方支付EPG传参App开发需求.md
## 一、项目概述
开发一款基于橘视厅 SDK 的视频点播 App,部署于酒店 IPTV 机顶盒(Android 4.2+)。支持两种入口:EPG 调起直接播放 和 App 内浏览点播。媒资列表、详情、分集、播放地址全部由橘视厅 SDK 提供,不依赖后端。
## 二、页面结构与流转(核心)
### 2.1 流转图
```
EPG Intent 调起 App 独立启动
(含设备标识 + 节目编码) (无节目编码)
│ │
▼ ▼
┌───────────────────────────────────────────────────┐
│ 启动页 │
│ 1. 解析 Intent 传参 │
│ 2. 调 init 接口 -> 获取 sign │
│ 3. 调 checkBenefits -> 获取 thirdCardNo │
│ 4. 初始化橘视厅 SDK │
└───────────────────────┬───────────────────────────┘
│
┌────────────┴────────────┐
│ │
有 programCode 无 programCode
│ │
▼ ▼
┌───────────────┐ ┌───────────────┐
│ 播放页 │ │ 媒资列表页 │
│ (直接获取地址 │ │ (SDK 提供数据) │
│ 全屏播放) │ └───────┬───────┘
└───────┬───────┘ │
│ ▼
│ 返回 ┌───────────────┐
└──────────────► │ 详情页 │
│ (SDK 提供数据) │
│ 选集/介绍/播放 │
└───────┬───────┘
│ 点击播放
▼
┌───────────────┐
│ 播放页 │
│ (全屏播放) │
└───────┬───────┘
│ 返回/播完
▼
回到详情页或列表页
用户可选其他影片
```
### 2.2 页面职责
| 页面 | 数据来源 | 职责 |
|------|---------|------|
| **启动页** | 后端 init/checkBenefits | 设备初始化、权益校验、SDK 初始化 |
| **媒资列表页** | **橘视厅 SDK** | 栏目分类、影片海报网格、分页加载 |
| **详情页** | **橘视厅 SDK** | 影片介绍、电视剧选集列表、播放入口 |
| **播放页** | **橘视厅 SDK** + MediaPlayer | 获取播放地址、全屏播放、遥控器控制 |
## 三、EPG Intent 接收(核心入口)
### 3.1 Intent 注册
```xml
<activity android:name=".LaunchActivity" android:exported="true">
<intent-filter>
<action android:name="com.pukka.mediaapp.PARTNER_LAUNCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
```
### 3.2 Intent 参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| mac | String | 否* | 设备 MAC |
| wifiMac | String | 否 | WiFi MAC |
| deviceSn | String | 否 | 设备 SN |
| deviceUid | String | 否* | 设备唯一标识 |
| programCode | String | 否 | **节目编码。有值=直接播放,无值=进入列表** |
> *mac 和 deviceUid 至少传一个,用于后端 init 接口识别设备。优先级:EPG 传入 > 本地采集。
### 3.3 启动分支逻辑
```
收到 Intent
│
├─ 步骤1:收集设备标识(优先 EPG 传入,兜底本地采集)
├─ 步骤2:调 init 接口 -> 获取 sign
├─ 步骤3:调 checkBenefits -> 获取 thirdCardNo + status
├─ 步骤4:用 thirdCardNo 初始化橘视厅 SDK
│
├─ 有 programCode?
│ ├─ YES -> 调 SDK 获取播放地址 -> 跳转播放页(全屏)
│ └─ NO -> 跳转媒资列表页
│
└─ 播放页返回后 -> 进入媒资列表页(用户可继续浏览)
```
## 四、init 与 checkBenefits 接口
### 4.1 设备初始化接口
```
POST http://{后端地址}/api/jst/init
Content-Type: application/json
请求体:
{
"mac": "EC:F7:2B:03:1F:97",
"deviceUid": "TEST-UID-001"
}
响应体:
{
"code": 0,
"msg": "success",
"sign": "OToxNzg1...", // 鉴权凭证,后续接口 Header 携带
"data": {
"device": { "deviceId": 9 }
}
}
```
### 4.2 权益查询接口
```
POST http://{后端地址}/api/jst/checkBenefits
Header: sign: {init 返回的 sign}
Content-Type: application/json
响应体:
{
"code": 0,
"msg": "success",
"data": {
"status": "ACTIVE", // ACTIVE=已激活 / UNBOUND=未绑定
"thirdCardNo": "DbzgHwPRK18pDKVZIS3AdBfQw", // 橘视厅 SDK uid 参数
"cardNo": "7D9AFE7677A758CD",
"expireAt": "2026-07-29 17:25:05"
}
}
```
### 4.3 心跳续期接口
```
POST http://{后端地址}/api/jst/heartBeat
Header: sign: {init 返回的 sign}
// 每 30 分钟调用一次,sign 过期后需重新调 init
```
> **后端只负责以上三个接口。媒资、详情、分集、播放地址全部由橘视厅 SDK 提供。**
## 五、橘视厅 SDK 能力(媒资+播放,全部 SDK 提供)
### 5.1 SDK 初始化
checkBenefits 返回 `thirdCardNo` 后,初始化 SDK:
```java
JetsenxSdk.init(
agcode, // thirdCardNo(checkBenefits 返回)
mac, // 设备 MAC
uid, // thirdCardNo(checkBenefits 返回)
"huashitv", // tenant(固定值)
secret, // 密钥(由橘视厅分配)
accesser, // 访问者标识(由橘视厅分配)
2, // utype(固定值)
"", // extendJson
"" // comboCode
);
```
### 5.2 SDK 提供的能力
| 能力 | SDK 方法 | 说明 |
|------|---------|------|
| 媒资列表 | SDK 提供 | 栏目分类、影片列表、海报、分页 |
| 内容详情 | SDK 提供 | 影片介绍、演员、评分等 |
| 电视剧分集 | SDK 提供 | 选集列表,每集 contentcode |
| 播放地址(付费) | `JetsenxSdk.getVideoUrls(productCode, programCode, callback)` | 返回 VideoInfo[],含 720P/1080P 地址 |
| 播放地址(免费) | `JetsenxSdk.getFreeVideoUrls(programCode, callback)` | parentContentType="8" 时调用 |
| 产品定价 | `JetsenxSdk.getAllAssetPrices(accesser, secret, callback)` | 获取 productCode(packageCode 字段) |
### 5.3 播放地址获取要点
```
1. productCode = getAllAssetPrices() 返回的第一个 packageCode
2. 根据 parentContentType 选择接口:
- "8" -> getFreeVideoUrls(programCode)
- 其他 -> getVideoUrls(productCode, programCode)
3. 返回 VideoInfo[],按 format 字段区分清晰度
4. programCode 必须是分集级编码(非电视剧父级编码)
```
## 六、播放页
### 6.1 技术方案
使用系统原生 **MediaPlayer + SurfaceView**(兼容 Android 4.2,**不用 ExoPlayer**):
- 支持 HLS(.m3u8)格式
- 全屏横屏播放
- 遥控器控制:OK键暂停/播放、左右键快进快退、返回键退出
- 播放地址带时效性 `auth_key`
### 6.2 播放完成流转
```
播放完成 / 用户按返回
├── EPG 直接播放进入的 -> 返回媒资列表页
└── 详情页进入的 -> 返回详情页(可继续选集播放)
```
## 七、技术约束(Android 4.2 兼容)
| 依赖 | 版本 | 原因 |
|------|------|------|
| minSdk | 17 | Android 4.2 |
| Retrofit | **2.6.0** | 2.9+ 传递依赖 OkHttp 3.14 不兼容 |
| OkHttp | **3.12.0**(force) | 3.12.1+ 含 Android10Platform,VerifyError |
| Gson | **2.8.6** | 2.9+ 含 ReflectionHelper,VerifyError |
| Coroutines | **1.6.4** | 1.7+ 要求 minSdk 21 |
| 视频播放 | **MediaPlayer** | ExoPlayer 2.14+ 不兼容 |
| 主题 | **AppCompat** | MaterialComponents 主 dex 方法数超限 |
| multidex | 启用 | 主 dex 保留 androidx.appcompat.** / kotlinx.coroutines.** / retrofit2.** |
## 八、参考代码
测试阶段已验证的代码在 `partner-test-app/` 目录:
| 文件 | 作用 |
|------|------|
| `JetsenxSdkUtil.kt` | SDK 封装:init + getVideoUrls + getFreeVideoUrls |
| `PartnerSignManager.kt` | 后端接口:init + checkBenefits + heartBeat |
| `PartnerApiService.kt` | Retrofit 接口定义 |
| `VideoPlayerActivity.kt` | MediaPlayer + SurfaceView 播放实现 |
| `multidex-config.pro` | Android 4.2 multidex 配置 |