包含内容: - thirdparty flavor 独立 applicationId + Intent 入口(ThirdPartyEntryActivity) - 58 后端接口适配(单 /api 路径、code 0/200、camelCase 字段、UNBOUND 轮询) - MAC 硬件锚定校验(防一凭证多设备共用) - EPG mac 覆盖 SDK init(sMacOverride)+ ChannelManger 初始化对齐 - 提示文案优化(设备未注册/权益未绑定)
9.0 KiB
9.0 KiB
盛阳等三方支付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 注册
<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:
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 配置 |