产品需求
广告页
- 支持视频循环播放(视频从服务器下载)
- 支持图片轮播放
- 悬浮一个按钮-按钮文字为”点一下开始拍照”
相机预览界面
- 点击相机进入相机预览界面
- 预览界面悬浮一个立即开拍按钮
- 点击按钮后倒计时3-2-1, 然后拍照
拍照结束后进入照片预览界面
- 选择照片背景模板(模板从服务器下载)
- 重新拍照
- 点击确认按钮
对预览照片不满意下一步可以选择进入手机上传, 满意则进入打印界面
手机上传界面
此界面用户用手机扫一扫即可上传手机中的照片,上传完成后,进入预览效果界面(预览界面显示从服务器下载的手机上传的照片)
微信支付界面
确认预览效果后进入微信支付页面,显示支付二维码,用户支付后进入打印界面
打印界面
打印界面显示二维码,用户可以用手机扫描后下载电子照片
补充需求点
- 设备是RK3568 21寸屏幕, 1080 x 1920 分辨率
- 设备通过MQTT和服务器保持连接
- 广告视频或者轮播图从服务器下发
- 预览界面的模板也从服务器下发
- 手机上传照片成功后服务器通知app调转到预览界面显示通过手机上传的照片
需求分析
广告引流 → 拍照 → 预览 & 模板 → 上传 / 支付 → 打印 & 下载
六个模块
AdModule // 广告播放
CameraModule // 相机预览 & 拍照
PreviewModule // 照片预览 & 模板
UploadModule // 手机上传
PaymentModule // 微信支付
PrintModule // 打印 & 下载二维码
核心是状态机
AD
CAMERA_PREVIEW
COUNTDOWN
PHOTO_TAKEN
PHOTO_PREVIEW
WAIT_UPLOAD
WAIT_PAYMENT
PRINTING
DONE
所有页面只是状态的“视图”, 页面不要互相跳转,只监听状态变化。
广告页(Ad Page)
工程实现建议:
- AdPlayer
- VideoPlayer(ExoPlayer)
- ImageSlideshow
- 定时器 + 生命周期绑定
- 必须支持“被打断立刻释放资源”
Claude Code 指令示例:
Design an Ad module for Android that supports:
- looping video playback
- looping image slideshow
- floating start button
- fast resource release when exiting
相机预览界面(Camera Preview)
工程实现
- Camera2 / CameraX
- 单次拍照(非录像)
- 倒计时不能卡 UI
- 拍完 立刻 stop preview
Claude Code 指令示例:
Design a camera preview and single-shot capture module
for an embedded Android device.
Requirements:
- 3-second countdown
- no UI dependency
- stable long-running behavior
照片预览界面(Preview + 模板)
工程实现
- 模板 = 图像渲染规则
- 一定要和 Camera 解耦
- 预览图 ≠ 打印图
- 打印图可以更高清,预览图可以低分
Claude Code 指令:
Design a photo template system that supports:
- background switching
- preview rendering
- final print rendering
手机上传界面(扫码上传)
工程重点
- 这是一个 异步、不可控流程
- 不能阻塞主流程
Claude Code 指令:
Design a QR-based photo upload flow
that supports async upload, timeout, and retry.
微信支付界面(Payment)
工程重点
- 支付 = 状态机的一部分
- 不能“靠回调跳页面”
Claude Code 指令:
Design a WeChat QR payment flow suitable for a kiosk device.
Focus on reliability and state recovery.
打印 & 下载界面(Print)
- 打印是 不可逆动作
- 一定要有失败兜底
- 本地 HTTP或云端短链接二维码
Claude Code 指令:
Design a printing flow with QR code download support.
Printing must be transactional and recoverable.
工作量评估
基础架构 & 状态机
| 模块 | 工作量 | 说明 |
|---|---|---|
| State Machine 设计 | 1.5 天 | |
| App 框架 / 包结构 | 0.5 天 | |
| 全局异常兜底 | 1 天 | 防死机、防断网 |
| 小计 | 3 天 | ⭐ |
UI & 流程实现(21 寸 1080×1920)
| 页面 | 工作量 |
|---|---|
| 广告页(视频/轮播) | 1.5 天 |
| 相机预览 + 倒计时 | 2 天 |
| 拍照预览 + 模板 | 2 天 |
| 手机上传引导页 | 1 天 |
| 支付二维码页 | 1 天 |
| 打印完成页 | 0.5 天 |
| 小计 | 8 天 |
Camera & 图片处理(大坑)
| 内容 | 工作量 |
|---|---|
| CameraX / Camera2 适配 | 2 天 |
| 倒计时拍照稳定性 | 1 天 |
| 图片裁剪 / 旋转 | 1 天 |
| 模板合成(Bitmap) | 2 天 |
| 小计 | 6 天 |
MQTT & 服务器联动(核心)
| 内容 | 工作量 |
|---|---|
| MQTT 长连接 | 1 天 |
| 心跳 & 重连 | 1 天 |
| 广告下发 | 1 天 |
| 模板下发 | 1 天 |
| 上传完成回调 | 1 天 |
| 小计 | 5 天 |
手机上传(扫码 + 通知)
| 内容 | 工作量 |
|---|---|
| 二维码生成 | 0.5 天 |
| 上传状态轮询 / MQTT | 1 天 |
| 异常兜底 | 0.5 天 |
| 小计 | 2 天 |
微信支付
| 内容 | 工作量 |
|---|---|
| 支付二维码展示 | 0.5 天 |
| 支付结果回调 | 1 天 |
| 支付异常处理 | 1 天 |
| 小计 | 2.5 天 |
打印 & 硬件对接
| 内容 | 工作量 |
|---|---|
| 打印 SDK 接入 | 1.5 天 |
| 状态回调 | 1 天 |
| 出错兜底 | 0.5 天 |
| 小计 | 3 天 |
稳定性 / 运维
| 内容 | 工作量 |
|---|---|
| 异常回广告 | 1 天 |
| 无人操作超时 | 0.5 天 |
| 日志 & 崩溃恢复 | 1 天 |
| 小计 | 2.5 天 |
总体估计
| 模块 | 主要内容 | 预估工期 |
|---|---|---|
| 启动 & 广告页 | 视频/图片轮播、资源缓存、异常兜底 | 2–3 天 |
| 相机预览 | Camera2 / USB 相机 / 全屏适配 | 4–6 天 |
| 倒计时 & 拍照 | 定时、闪屏、快门控制 | 1–2 天 |
| 照片预览 | 模板叠加、背景切换 | 4–5 天 |
| 手机扫码上传 | 二维码、HTTP/MQTT 通知 | 3–4 天 |
| MQTT 通信 | 设备在线、状态同步、事件推送 | 2–3 天 |
| 微信支付 | 二维码、回调、异常 | 2–3 天 |
| 网口打印 | TCP/IP 打印、状态确认 | 3–5 天 |
| 打印完成展示 | 二维码下载电子照 | 1 天 |
| UI 适配 | 21 寸竖屏、全屏沉浸 | 2 天 |
| 异常 & 稳定性 | 断网、相机失败、重试 | 3–4 天 |
合计:约 32–40 个工作日(6–8 周)
打印机选型
HP OfficeJet 5225n 网口激光打印机
- 耗材: 使用 HP 307A 碳粉盒。黑色寿命约 7,000 页,彩色约 7,300 页。这意味着你从“几天换一次墨盒”变成了“几个月换一次碳粉”,维护成本暴降。
- 负载: 月打印负荷高达 75,000 页,非常适合自助机这种高频率场景。
- 纸张: 支持 A3/A4 甚至更大尺寸(SRA3),如果你要做大幅面海报打印,这台机器非常强悍。
打印协议
CP5225n 支持标准协议:HP PCL 6, HP PCL 5c, HP Postscript level 3 emulation。
RAW Socket (Port 9100) 激光机对 PCL 指令的支持非常完美。可以直接将处理好的 PCL 数据流通过网络端口推给打印机, 真正的静默打印,无需安装任何 Android 打印插件,完全掌控打印过程。
打印流程
+---------------------------+
| 用户确认打印/下载二维码 |
+-----------+---------------+
|
v
+---------------------------+
| 渲染高分打印图(照片+模板) |
+-----------+---------------+
|
v
+---------------------------+
| 生成 PCL/PostScript 数据 |
+-----------+---------------+
|
v
+---------------------------+
| 建立 TCP Socket 连接打印机 |
| (Port 9100) |
+-----------+---------------+
|
v
+---------------------------+
| 异步发送 PCL 数据流 |
| (分包 / 缓冲处理) |
+-----------+---------------+
|
v
+---------------------------+
| 等待打印机 ACK 或状态响应 |
+-----------+---------------+
|
+-----+-----+
| |
v v
+-----------+ +----------------+
| 打印完成 | | 打印失败/重试 |
+-----------+ +----------------+
| |
v v
+-----------+ +----------------+
| 状态机更新 | | 异常处理/回退 |
| DONE/打印完成 | | 返回广告页或重试 |
+-----------+ +----------------+
工程风险点
- 相机:硬件适配 + 倒计时 + 高分拍照 + 异常恢复
- 模板合成:高分渲染 + 异步处理 + 缓存管理
- 打印:网络打印协议 + 状态确认 + 异常回退
Claude Code
第一阶段:定义“灵魂”(架构与状态机)
目标: 建立全局唯一状态源,确保无人值守逻辑不乱。
给 Claude Code 的指令:
我们要基于 RK3568 (4+32G) 开发拍报机。请先构建项目基础骨架:
使用 MVI (Model-View-Intent) 架构。定义 MachineState 密封类,涵盖:IdleAd(广告)、CameraCapture(拍照)、PhotoEdit(合成预览)、Payment(支付)、Printing(打印中)、Finish(完成)。
创建一个全局 AppStateManager,使用 StateFlow 驱动 UI 切换。
配置 build.gradle,引入 CameraX、ExoPlayer、MQTT-Paho、Glide 和 Zxing 依赖。
针对 1080x1920 竖屏,生成基础布局资源文件
攻克“硬件双壁”(相机与打印)
目标: 解决风险最高的两个环节。
给 Claude Code 的指令: “现在处理核心硬件对接,请分步完成:
相机: 实现 CameraModule。针对 1080P 预览,确保不拉伸,并提供一个 takePhoto() 方法,拍照后返回 Bitmap。
打印: 编写 HPPrintService。使用 IPP 协议 封装,通过 TCP 631 端口向指定 IP 的 HP 5255 发送打印任务。
状态反馈: 打印类必须能异步返回:CONNECTING, PRINTING, SUCCESS, ERROR_PAPER_OUT(缺纸)。
由于有 4G 内存,拍照和预览时不需要强制销毁视频插件,保持切换流畅。”
打通“云端大脑”(MQTT 与 手机上传)
目标: 实现远程控制和手机扫码交互。
给 Claude Code 的指令: “现在实现通讯模块:
MQTT: 编写一个长连接服务。监听 ad/update(更新素材)和 cmd/reboot 指令。
异步通知: 当用户在‘手机上传界面’扫描二维码后,服务器会发送 MQTT 消息告知 App 上传成功。请写好监听逻辑,收到信号后自动跳转到 PhotoEdit 状态。
资源下载: 编写一个 DownloadManager,支持断点续传下载服务器下发的视频素材到 32G 存储空间。”
图像处理与“面子工程”(模板合成)
目标: 利用 4G 内存优势,实现高质量合成。
给 Claude Code 的指令: “请实现图片合成逻辑:
用户拍照后,需要将照片叠加在服务器下载的 PNG 模板之上。
使用 Canvas 进行离屏渲染。因为内存充足,请使用 Config.ARGB_8888 保证最高画质,并支持双指缩放和位移微调照片。
生成一个用于打印的 300 DPI 高清图和用于显示的低分缩略图。”
第五阶段:稳定性运维(无人值守逻辑)
目标: 确保机器死不了。
给 Claude Code 的指令: “最后,增加鲁棒性逻辑:
无操作超时: 在非广告状态下,若 60 秒无交互,自动回退到 IdleAd 状态。
异常保护: 如果打印机断开或 MQTT 掉线,在屏幕右上角显示一个微小的 UI 提示,但不阻碍用户基本浏览。
定时任务: 每天凌晨 3 点,检查是否有新广告素材,并清理 7 天前的缓存图片。”
Claude Code 本身不会像网页版那样保留一个“对话列表”,但它通过“本地状态”和“上下文分析”实现了一种更高级的“记忆”。
即便系统重启,只要你在同一个项目目录下再次运行 claude,它依然能接上之前的活。
.claude/ 隐藏文件夹在项目中会记录
增加AI后工期对比
| 模块 / 内容 | 人工开发 | Claude Code 协助开发 | 工期差异 | 说明 / 风险 |
|---|---|---|---|---|
| 状态机 & App 框架 | 3 天 | 2 天 | -1 天 | Claude Code 可生成状态机骨架,减少重复手写 |
| 广告页(视频/图片轮播) | 1.5 天 | 1 天 | -0.5 天 | AI 可生成布局与播放示例代码 |
| 相机预览 + 倒计时 | 2 天 | 1.5 天 | -0.5 天 | AI 可生成 CameraX/Camera2 拍照 + 倒计时示例,但 USB 调试仍需人工 |
| 拍照预览 + 模板 | 2 天 | 1.5 天 | -0.5 天 | AI 可生成 Bitmap 合成示例,异步渲染代码模板 |
| 手机上传 | 2 天 | 1.5 天 | -0.5 天 | AI 可生成二维码 + MQTT 轮询示例 |
| 微信支付 | 2.5 天 | 2 天 | -0.5 天 | AI 可生成二维码展示与回调模板 |
| 打印 & 硬件对接 | 2.5 天 | 2 天 | -0.5 天 | 打印机换成 CP5225n,RAW Socket 直连,AI可生成发送示例 |
| 异常 & 稳定性 | 2.5 天 | 2 天 | -0.5 天 | AI 可生成 try/catch + 异步回调示例,但网络/USB 异常仍需人工处理 |
| UI 适配 | 2 天 | 1.5 天 | -0.5 天 | AI 可生成布局和约束,节省手写时间 |
| 总计 | 32–33 天 | 25–27 天 | 节省 5–6 天 | 高分模板渲染、USB 摄像头调试仍需人工 |