设计背景与核心宗旨
解决传统商业提词软件过度商业化与隐私滥用的现实痛点
解决提词行业的现实困境
市面商业提词应用长期存在三大硬伤:强制手机号注册绑定、强行将隐私演讲文稿上传云端、以及高额买断/连续订阅与广告插播。在多端协同方面,双机远控大多依赖昂贵或高延迟的公网服务器中继,在演播厅、展会弱网或无网络环境下极易瘫痪。
映辞从首行代码起即确立了四个不可动摇的工程原则:
技术路线与架构拓扑
基于仓库真实代码提炼的技术层级流转
Android Runtime & Toolchain
专为 Android 平台设计:编译适配 Android 16 (API 36.1),向下兼容至 Android 8.0 (API 26)。暂无 iOS / 苹果版本支持计划。
Kotlin & Build Pipeline
采用 Kotlin 2.2.10,Gradle 9.4.1 构建套件与协程并发流 (Flow)
Jetpack Compose & Material 3
声明式 UI 架构,BOM 2026.02.01,单 Activity + Navigation Compose
AppContainer DI & Repository
轻量无反射延迟注入,单向数据流驱动,ViewModel 响应式状态流
Room & DataStore & WebSocket
版本化 SQLite Schema 存储台本,局域网 Java-WebSocket 双机点对点通信
核心依赖清单与版本
全部直接对应项目 gradle/libs.versions.toml 声明
| COMPONENT / LIBRARY | VERSION | ROLE & SCOPE |
|---|---|---|
| androidx.compose.bom | 2026.02.01 | Compose 基础运行环境与版本协调 |
| kotlin | 2.2.10 | 主工程编译语言与标准库 |
| agp (Android Gradle Plugin) | 9.2.1 | Android 官方构建工具链插件 |
| androidx.navigation.compose | 2.9.6 | 单 Activity 纯声明式路由导航 |
| androidx.room | 2.8.4 | 本地 SQLite 数据库与 Schema 版本管理 |
| androidx.datastore.preferences | 1.2.1 | 全局播放设置与偏好持久化 |
| java-websocket | 1.5.6 | 局域网提词端 Server 与控制端 Client 通信 |
| zxing-android-embedded | 4.3.0 | 局域网配对二维码扫码识别 |
系统分层与数据流
单工程模块设计,清晰划分 UI、Domain、Data 边界
单向数据流与容器注入
TeleprompterApplication 初始化单一 DefaultAppContainer,负责延迟构造 Room 数据库与 Repositories。UI 层通过 ViewModel 暴露不可变 StateFlow,页面永远不直接触碰持久化底层。
提词端作为唯一状态源
在双机远控架构中,提词端是唯一真实状态源 (Single Source of Truth)。控制端发送的命令经校验后转换为业务事件;提词端将最新排版快照与阅读游标反向推回控制端,避免双向时钟分歧。
本地文档解析流水线
不依赖任何第三方服务端,全流程在终端设备内存中安全流式解析
智能字符编码识别 (TXT)
自动检测文件头 BOM 标记,智能识别 UTF-8、UTF-16 LE/BE 以及中文常见的 GB18030 字符集。5 MiB 严格大小阈值校验,彻底规避乱码现象。
Word (DOC / DOCX) 纯本地提取
DOCX 基于 OOXML 规范在本地解压提取主正文段落;DOC 基于 OLE2 二进制流进行控制状态机清洗,自动跳过表格、图片、超链接与目录等干扰结构,严防 XML 外部实体攻击。
局域网阅读游标同步算法
攻克双设备屏幕尺寸与折行不一致导致的长文错位问题
绝对 UTF-16 游标与滑动阅读窗口
传统提词软件双机同步多采用“直接推送屏幕可见文字字符串”的粗暴方案,一旦提词端是横屏大平板而控制端是竖屏窄手机,极易引发严重换行错乱与跳变。
映辞采用双流解耦同步算法:
PlaybackReadingTracker 根据实际排版几何与固定阅读锚点,持续计算全文绝对 UTF-16 字符偏移量与行内亚字符进度(约 12~20Hz 高频传输)。ReadingWindowManager 维护低频约 700 字符的大上下文窗口,在游标触达前进 72% / 后退 18% 阈值时平滑滑动。ControllerReadingViewport 利用本地 TextLayoutResult 排版窗口文字,配合 Pending Cursor 机制,确保长文持续滚动零空白与零回跳。权限与隐私安全白皮书
透明列出应用所声明的每一项系统权限与真实代码调用场景
| PERMISSION | STATUS | USAGE CONTEXT | SECURITY GUARANTEE |
|---|---|---|---|
| android.permission.INTERNET | SAFE / LAN ONLY | 提词端与控制端之间建立局域网 WebSocket 连接 | 代码中无公网请求,不连接任何第三方中继或遥测服务。 |
| android.permission.ACCESS_NETWORK_STATE | SAFE / LOCAL | 提词端启动远控时解析当前设备的局域网 IPv4 地址 | 仅用于在本地生成配对二维码,不读取或上传网络标识符。 |
| android.permission.CAMERA | OPTIONAL DYNAMIC | 控制端扫描提词端配对二维码时使用 | 非必需硬件(required=false),支持手动输入连接信息;画面纯本地分析不上传。 |
| 外部存储读写权限 | ZERO PERMISSION | 文档导入基于 Android Storage Access Framework (SAF) | 不申请 READ_EXTERNAL_STORAGE,单次流式读取,不长期持有文件 URI。 |
源码获取与本地复现
基于标准开源规范,任何开发者均可直接在本地独立复现完整构建