📌 项目起源:本项目基于 wb-hwang/AIAnswerer-Android(MIT License)Fork 并独立发展。上游已停止维护(最后更新:2025年10月),本仓库持续迭代中。感谢原作者 @wb-hwang 的优秀基础工作。
AI答题助手是一款基于 OCR/视觉模型与大语言模型的安卓答题工具。通过悬浮窗截图识别题目,并调用 DeepSeek AI 等兼容 OpenAI 接口的模型为你快速给出答案,适用于练习、查缺补漏或自测场景。
- 🖼️ 屏幕快速截取:一键截取当前屏幕,自动聚焦题目区域
- 📖 屏幕读取模式:通过无障碍服务直接读取屏幕文字,无需截图,速度更快
- 📝 智能文字识别:支持中英文识别,可在提交前编辑校正
- 👁️ 视觉模型支持:可使用视觉模型替代 OCR,适合噪音较多的页面
- 🔍 联网搜索增强:自动搜索相关资料作为答题参考
- 🤖 AI 实时答题:根据题型生成解析,并自动复制答案
- 📋 批量答题:截图包含多题时逐题搜索并返回所有答案
- ⚡ 并行答题:多题模式下支持并发处理,显著提升答题速度
- 💬 悬浮窗操作:无需切换应用即可完成截屏、预览、提交
- 🔒 本地可控:自定义 API Key,随时启停网络请求
- 🌐 中英双语:支持中文和英文界面切换
| 类别 | 技术 |
|---|---|
| 语言 | Kotlin 2.0.21 |
| UI | Jetpack Compose + Material3 |
| OCR | Google ML Kit (中文+拉丁文) |
| 视觉模型 | OpenAI 兼容接口 (DeepSeek/GPT-4o 等) |
| 联网搜索 | Tavily API |
| 网络 | OkHttp 4.12.0 |
| 存储 | MMKV + EncryptedSharedPreferences |
| 构建 | Gradle (AGP 8.13.0) |
- 使用 Android 11 及以上系统的设备,并保持网络通畅。
- 安装提供的 APK 文件;首次安装需按照系统提示允许来自未知来源的应用。
- 设置 LLM 模型信息。
- 首次启动时,按照屏幕提示授予悬浮窗、截屏和通知等必要权限。
- 参考应用内说明
- 选择题:识别题干与选项,标记推荐答案并给出理由
- 填空题:生成精炼答案,适用于多空位题目
- 问答题:提供结构化解答或要点式分析
- 保持截图清晰、居中,避免复杂背景,以提升 OCR 准确率。
- 如需暂停网络请求,可暂时断网或在设置页关闭 AI 回答。
- 答案生成后可再次点击悬浮按钮刷新题目,便于连续练习。
- 提示缺少权限? 前往系统设置搜索"悬浮窗""屏幕录制"等选项,手动开启相关权限。
- 识别不准确? 在确认页手动修正文本,或重新截图后再提交。
- AI 没有回应? 检查网络、确认 API Key 有效,并确保 DeepSeek 账户余额充足。
- 应用会将识别出的文字发送至所选 AI 服务,请避免上传敏感或受限内容。
- DeepSeek API 请求可能产生费用,请留意使用频率。
- 本应用仅用于学习与研究,请遵守考试纪律和法律法规,任何违规使用后果自负。
com.hwb.aianswerer/
├── BaseActivity.kt # 统一语言配置基类
├── MyApplication.kt # Application 初始化
├── MainActivity.kt # 主界面(权限管理、答题设置)
├── FloatingWindowService.kt # 悬浮窗核心服务
├── ScreenReaderService.kt # 无障碍屏幕读取服务
├── ScreenCaptureManager.kt # 截图管理(MediaProjection)
├── TextRecognitionManager.kt # OCR 文字识别
├── ConfirmTextActivity.kt # 识别文本确认/编辑
├── ImageCropActivity.kt # 图片裁剪(四角拖拽)
├── SettingsActivity.kt # 通用设置
├── ModelSettingsActivity.kt # API 模型配置
├── AboutActivity.kt # 关于页面
├── Constants.kt # 常量与系统提示词
├── api/
│ ├── OpenAIClient.kt # OpenAI 兼容 API 客户端
│ ├── TavilyClient.kt # Tavily 联网搜索客户端
│ └── vision/ # 视觉模型模块
│ ├── VisionProvider.kt
│ ├── VisionProviderFactory.kt
│ ├── VisionFilterResult.kt
│ └── OpenAIVisionProvider.kt
├── config/
│ └── AppConfig.kt # 配置管理(MMKV + 加密存储)
├── models/ # 数据模型
├── ui/
│ ├── components/ # 共享 Compose 组件
│ ├── dialogs/ # 对话框
│ ├── icons/ # 本地图标定义
│ └── theme/ # Material3 主题
└── utils/
├── AppLog.kt # 统一日志工具
├── ClipboardUtil.kt # 剪贴板工具
├── ImageCropUtil.kt # 图片裁剪工具
└── LanguageUtil.kt # 语言切换工具
- 并行模式答案顺序修复:并行答题时答案不再乱序,按题目原始顺序排列
- 架构重构
- 大文件拆分:CommonComponents(1256行)→5文件、OpenAIClient(996行)→2文件、AppConfig(1005行)→8文件(门面模式)
- 新增 38 个单元测试覆盖 JSON 解析、弹窗排队、提示词生成
- 厂商列表从 13 个扩充至 52 个,覆盖国内外主流 AI 厂商
- 性能优化
- System Prompt 精简约 80%,AI 分析速度显著提升
- maxTokens 1024→512,减少冗余输出
- 超时时间 180s→60s,避免长时间等待
- 并行模式默认开启,并发数默认 10
- Bug 修复
- 录制模式 captureCount 不递增导致结果无法显示
- 隐身模式/悬浮窗外观设置不立即生效
- 悬浮窗大小滑块不生效
- 厂商链接/关于页 GitHub 链接点击无反应
- 搜索开关重启后状态丢失
- 题型选择翻译不一致导致 AI 输出串题型
- 答案卡片过长被裁
- UI 优化
- 自定义应用图标(神经网络节点 + 对勾设计)
- Android 12+ 启动屏联动新图标
- 悬浮窗默认大小 56→40
- VLM 快捷开关默认跟随视觉模型配置自动开启
- 录制模式窗口触摸区域优化
- 快捷按钮布局模式
- 新增快捷按钮排列方式设置:弧形排列 / 横向排列,可在设置页随时切换
- 弧形排列:半圆环绕主按钮,展开时窗口动态扩展(原有方式)
- 横向排列:水平排列在主按钮旁,与原始设计一致,展开时窗口不变
- 横向排列支持 Q 弹展开/收起动画(expandHorizontally + scaleIn 弹簧效果)
- 拖拽主按钮时自动收起快捷按钮
- 深色模式适配
- 修复主页状态卡片图标在深色模式下颜色不适配的问题
- 未激活状态图标改为 #FCA731 橙色,深色模式下对比度更好
- 设置页优化
- 合并并发数设置和连接测试为同一个卡片,中间用分隔线区分
- 界面更紧凑,减少卡片数量
- 录制模式(新功能)
- 新增录制模式,支持连续拍摄多道题目,录制过程中同步进行答题处理
- 录制期间答案不显示,仅显示红色录制指示器和已拍题数
- 停止录制后统一输出所有答案,每题以分隔线区分,包含完整题目、选项和答案
- 自动去重:基于文本归一化比对,重复题目自动跳过,最终显示去重统计
- 复制格式简洁:仅包含题号和答案(如
第1题:A) - 并发数限制:活跃任务数达到上限时拒绝截图并提示用户等待
- 最大并发数上限从 10 提升至 50
- 中止搜索
- 答案卡片标题栏的关闭按钮在搜索进行中变为红色停止图标
- 点击可立即中止正在进行的 HTTP 请求,中断 LLM 流式响应
- HTTP 请求改用异步 API(OkHttp enqueue),协程取消时直接断开连接
- 快捷面板动画优化
- 长按主按钮弹出的快捷面板改为弹簧动画(scaleIn/scaleOut + fadeIn/fadeOut)
- 展开和收起都有 Q 弹的物理效果,替代生硬的瞬时切换
- 点击录制按钮后快捷面板自动收起,无需再点一次主按钮
- 空安全修复
- 修复
attachBaseContext(newBase!!)强制断言导致的崩溃风险 - 修复
screenCaptureResultCode!!强制解包导致的崩溃风险 - 修复
bitmap!!强制断言导致的崩溃风险 - 修复
savedResultCode!!强制断言导致的崩溃风险
- 修复
- 线程安全修复
- 修复
questionTypes使用非线程安全的mutableSetOf导致的潜在崩溃 - 修复
savedCropRect可见性问题,添加@Volatile注解 - 修复
fetchMutex作用域不一致导致的潜在死锁
- 修复
- 资源泄漏修复
- 修复截屏 bitmap 在 crop 异常时未 recycle 导致的内存泄漏
- 修复
TextRecognitionManager取消时 close 导致单例不可用的问题 - 修复临时文件残留问题,在
MyApplication.onCreate()中清理 - 修复
ScreenCaptureManagerlistener 未移除导致的泄漏
- 逻辑错误修复
- 修复
START_STICKY导致服务被 kill 后成为僵尸服务的问题 - 修复
sanitizeJson()将中文引号全局替换破坏 JSON 字符串内容的问题 - 修复
OpenAIVisionProvider单例缓存导致配置更新不生效的问题 - 修复
OpenAIVisionProviderJSON 解析失败时默认返回hasQuestions=true的问题 - 修复
ScreenCaptureManagervirtualDisplay 创建失败后 continuation 永远不被唤醒的问题
- 修复
- 安全增强
- 修复
EncryptedSharedPreferences失败后 API 密钥静默降级为 MMKV 明文存储的问题 - 修复 Debug 日志可能泄露敏感信息的问题,日志级别从 BODY 改为 HEADERS
- 修复
BuildConfigfallback 可能泄露 API Key 的问题 - 修复
allowBackup=true允许云备份包含 MMKV/缓存数据的问题
- 修复
- 构建优化
- 修复无签名配置时 release 构建直接失败的问题,改为 fallback 到 debug 签名
- 修复
abiFilters仅 arm64-v8a 导致模拟器和 32 位设备无法运行的问题 - 修复使用 AGP 内部 API
BaseVariantOutputImpl导致 AGP 升级即 break 的问题 - 修复
AppConfig中mmkvlateinit var 未初始化前调用导致崩溃的问题
- UI 修复
- 修复
parseSections中空标签导致 UI 显示空行的问题
- 修复
- 悬浮窗快捷开关
- 新增长按主按钮展开快捷开关(VLM、联网搜索、深度思考)
- 快捷开关采用长条展开布局,支持左右两侧展开
- 点击快捷开关可即时切换状态,无需进入设置页
- 快捷开关颜色适配主题,启用状态显示深灰色背景
- 长按主按钮时显示环形进度条动画
- 悬浮窗交互优化
- 修复主按钮点击时跳动的问题,移除不必要的缩放动画
- 优化拖动流畅度,提高触摸事件处理频率
- 小按钮展开时点击主按钮只收起小按钮,不触发截图
- 拖动主按钮时自动收起小按钮
- 窗口位置修复
- 修复主按钮不贴屏幕边缘的问题
- 修复右侧展开时小按钮距离主按钮过远的问题
- 简化窗口位置计算逻辑
- 悬浮窗 UI 重构
- 悬浮按钮独立显示,不再集成到卡片中
- 按钮全程使用深灰色调,不再变色
- 删除转圈动画,简化为静态图标
- 状态消息优化
- 识别中、模型分析等状态消息集成到标题右侧
- 答案显示时自动隐藏状态消息,避免割裂感
- 并发测试反馈修复
- 修复并发测试结果不显示的问题
- 测试成功后显示实际延迟时间
- UI 配色统一
- 按钮在所有状态下保持深灰色调
- 答案内容区域与 Header 无缝连接
- 全局点击反馈
- 深色模式点击任意可交互元素时显示紫色发光轮廓光效
- 浅色模式统一柔和紫色涟漪,去除生硬阴影
- CTA 按钮重做
- 进入答题模式按钮从深色渐变改为明亮紫色发光渐变
- 移除多余图标,纯文字按钮更简洁
- 背景色调优化
- 浅色模式整体背景偏暖(象牙色调)
- 深色模式背景提亮,减少视觉疲劳
- 使用说明卡片
- 展开/收起箭头更换为圆润三角图标
- 动画更 Q 弹(低阻尼弹簧)
- 屏幕读取模式(新功能)
- 新增采集模式切换:截图识别 / 屏幕读取,设置页芯片选择
- 屏幕读取通过 AccessibilityService 直接获取屏幕文字节点,无需截图权限,速度更快
- 选择屏幕读取时若无障碍服务未开启,自动跳转系统无障碍设置页
- 无障碍状态指示点(绿色/红色)实时显示服务开启状态
- 从系统设置返回后自动刷新状态(LifecycleEventObserver 监听 ON_RESUME)
- 无障碍提示文字可点击,直接跳转系统设置
- 新增 ScreenReaderService、accessibility_service_config.xml,AndroidManifest 注册服务
- Bug 修复
- 修复正则
\\{[^{}]*}在部分 Android 设备崩溃的问题(改为\\{[^\\{\\}]*\\}显式转义) - 修复自动复制到剪贴板会复制题目+答案的问题,改为只复制答案文本
- 修复正则
- 深色模式 UI 修复
- 修复深色模式下按钮出现直角边框与大圆角边框重叠的问题
- 重写 Glass.kt 和 Shadow.kt:统一使用 drawBehind 绘制背景+边框+阴影,消除双层边框
- 阴影系统从 Modifier.shadow() 改为 drawIntoCanvas + setShadowLayer 原生阴影
- 阴影参数从 Shape 改为 Dp(cornerRadius),统一所有调用点
- 组件修复
- 修复 AnimatedButton graphicsLayer 顺序导致的渲染问题
- 修复 Tonal 按钮直角边框,简化为 Modifier.background + shape
- 修复图标因 Color.Unspecified 不显示的问题,恢复为 Color.Black
- 统一所有 shadow 调用参数适配新的 Dp 类型
- 正则过滤开关
- 联网搜索设置页新增"多题正则过滤"开关(默认开启)
- 关闭后,OCR 检测到多题时仍会进行联网搜索
- 思考模式开关
- LLM 模型设置页新增"启用思考模式"开关(默认关闭)
- 开启后向 API 发送
reasoning_effort: "medium"参数 - 适用于 o1、DeepSeek-R1 等推理模型
- Bug修复 (10个)
- 修复VLM失败后OCR降级失效的问题
- 修复VLM配置修改后不生效的问题
- 修复截图时Bitmap内存泄漏
- 修复按返回键意外停止悬浮窗服务
- 修复并发请求竞态条件
- 修复裁剪Activity临时文件残留
- 修复语言切换后通知栏残留幽灵通知
- 修复HTTP错误响应未正确关闭连接
- 修复VLM连接测试格式错误
- 修复JSON解析正则贪婪匹配问题
- 性能优化
- 全局共享Gson实例,减少内存分配
- HTTP响应使用use{}自动关闭,防止连接泄漏
- LLM Temperature参数可配置化
- Compose重组延迟提取为常量
- 代码质量
- 添加Mutex互斥锁防止并发请求
- 统一错误处理和资源释放
- 完善ProGuard规则
- 版本号 v1.0.0
- 并行答题模式
- 新增并发答题设置卡片,支持启用/禁用并行模式
- 可配置最大并发数(1-10),默认3
- 高并发数(>5)显示警告提示,避免API限流
- 分别为LLM、VLM、联网搜索提供测试按钮,可测试各API延迟
- 多题模式下自动并行处理,显著提升答题速度
- 进度显示优化
- 并行模式显示
答题中 (3/8)格式,实时更新进度 - 部分题目失败时显示警告,只返回成功的结果
- 并行模式显示
- 测试功能增强
- 测试按钮显示实际延迟时间(毫秒)
- 支持测试LLM、VLM、Tavily三个API的并发性能
- 测试结果独立显示,互不干扰
- GitHub Actions 自动打包
- 新增 CI/CD 工作流,支持自动构建 Debug APK
- 推送
v*标签时自动发布 Release
- 版本号 v0.0.9
- 毛玻璃材质
- 所有卡片采用微渐变 + 半透明 + 渐变边框,告别纯色平面
- 悬浮窗答案卡片支持毛玻璃效果,透明度可由设置页调节
- 暗色模式下卡片有"浮起来"的玻璃质感
- 渐变发光按钮
- 底部答题按钮从纯色升级为横向渐变(primary → secondary)
- 带发光阴影效果,视觉焦点更突出
- 实时主题切换
- 设置页新增外观模式:跟随系统 / 浅色模式 / 深色模式
- 切换即时生效,无需重启应用
- 状态栏样式自动同步
- 色彩体系重构
- 浅色模式:明蓝主色
#4A6CF7,暖米背景#F6F5F3 - 暗色模式:深蓝主色
#2563EB,深灰蓝背景#0F1118 - 通知栏颜色与主题统一
- 浅色模式:明蓝主色
- 圆角与间距
- 统一圆角 16-24dp,更大呼吸感
- 按钮圆角 18dp,胶囊形 FilterChip
- 状态栏适配
- 使用
enableEdgeToEdge适配状态栏 - 浅色模式深色图标,暗色模式浅色图标
- 使用
- 清理冗余功能
- 移除"题目内容范围"输入框及相关代码
- 版本号 v0.0.8
- 视觉模型 (VLM) 集成
- 支持使用视觉模型直接分析截图,替代 OCR 识别
- 抽象 VisionProvider 接口,支持 OpenAI 兼容格式
- 通过工厂模式创建 Provider,便于扩展
- 设置页可配置视觉模型 API 地址、Key、模型名称
- 支持测试视觉模型连接
- VLM 失败时自动降级为 OCR 模式
- 多题模式优化
- VLM 自动分离多题截图中的每道题目
- 每道题单独进行联网搜索,提升搜索精准度
- 逐题调用 LLM 答题,确保每道题都能获得答案
- 状态显示优化:
搜索中 (1/8)、获取答案中 (2/8)等
- 图片压缩优化
- 修复图片尺寸超过 API 限制的问题(2048x2048)
- 同时限制宽度和高度,等比缩放
- 超时优化
- 视觉模型 API 超时时间从 60 秒增加到 120 秒
- 架构优化
- 新增
api/vision/模块,独立管理视觉模型相关代码 - VisionFilterResult 支持分离题目列表
- AppConfig 扩展视觉模型配置项
- 新增
- 版本号 v0.0.8
- Tavily 联网搜索
- 集成 Tavily 搜索引擎 API,单题模式下自动搜索相关资料并注入 LLM 上下文
- 搜索结果作为答题参考,提升冷门题目的准确率
- 设置页可配置 Tavily API Key(加密存储)和启用开关
- 支持测试 Tavily 连接
- 智能提取搜索关键词:从 OCR 文本中提取题干和选项,过滤 UI 噪音
- 多题模式自动跳过搜索,避免无效 API 调用
- 悬浮窗交互重构
- 悬浮按钮支持自由拖拽移动,可吸附到屏幕左/右边缘
- 点击截图,拖拽移动,一个按钮两个功能
- 卡片从按钮正下方出现,不遮挡按钮位置
- 按钮位置不受卡片显隐影响,窗口宽度变化时按钮稳定
- 修复悬浮窗遮挡下层应用触摸的问题(WRAP_CONTENT 窗口)
- 悬浮窗外观自定义
- 设置页新增悬浮窗外观配置:按钮大小(32~80dp)、按钮透明度、卡片透明度
- 实时生效,无需重启 Service
- Bug 修复
- 修复第二次截图输出第一次答案的问题(等待 Compose 重组完成 + 清除 ImageReader 旧帧)
- UI 优化
- 设置页支持上下滚动
- 关于页面更新 GitHub 地址,移除邮箱卡片
- 版本号 v0.0.6
- 安全增强
- API Key 使用 EncryptedSharedPreferences 加密存储,不再明文保存
- Release 构建移除 HTTP 日志,防止 API Key 泄露到 logcat
- 添加 OkHttp CertificatePinner 证书固定,防止中间人攻击
- 即使 Debug 模式也对 Authorization 头脱敏
- 架构优化
- 抽取 BaseActivity 统一语言配置,消除 6 处重复代码
- 悬浮窗 Composable 组件独立文件,Service 职责更清晰
- 统一协程作用域,修复 CancellationException 被吞噬的问题
- 国际化完善
- 所有悬浮窗状态消息支持中英文切换
- 通知渠道名、剪贴板标签等均使用字符串资源
- 网络增强
- 添加网络连接预检,无网络时快速提示
- API 请求支持自动重试(指数退避)
- Service 销毁时自动取消进行中的网络请求
- 构建优化
- 移除冗余 ML Kit 依赖(-10MB 包体积)
- 所有依赖版本统一到 Version Catalog
- 收紧 ProGuard 规则,提升 R8 混淆效果
- 代码质量
- 统一日志工具 AppLog,Release 构建静默
- 消除所有
e.printStackTrace()调用 - 修复
savedCropRect!!空安全风险 - 补充核心单元测试(extractJsonPayload、isApiConfigValid)
- JSON 解析优化
- 支持批量答题:截图包含多题时返回所有答案
- 5 级降级解析策略:直接解析 → 提取修复 → 正则数组 → 正则对象 → 文本提取
- 修复中文引号导致 JSON 截断的问题
- 系统提示词优化:强制 AI 填写 answer 字段,不得留空
- 优化了prompt
- 兼容了GPT-5传回的markdown 格式
- 加入COR 前裁剪功能,提高题目识别能力
- 修复release 包无法请求ai api 的问题
- 初次发版
This project is released under the MIT License