[Bug]: tts听书的下一章内容获取依赖于前台运行的界面实例,导致app后台或者手机锁屏时tts听书不会自动跳转到下一章节
- Ngôn ngữ chính
- Dart
- Star
- 8.8k
- Fork
- 626
- Merge trung bình
- 9 ngày 22 giờ
- Pull request đã merge (30 ngày)
- 1
Mô tả
### Prerequisites|前提条件
- [x] I have checked the [troubleshooting](https://github.com/Anxcye/anx-reader/blob/develop/docs/troubleshooting.md)|我已经查看过[故障排除](https://github.com/Anxcye/anx-reader/blob/develop/docs/troubleshooting.md)
- [x] I have searched for similar issues and did not find any|我已经搜索过没有相同的问题
### Describe the bug|描述问题
可能原因:
内容获取耦合依赖一个在前台运行的 InAppWebView 组件,而一旦应用进入后台或设备锁屏,WebView 的 JavaScript 执行会受到严格限制或完全暂停。
1、跳转章节依赖 WebView:当 TTS 播放到章节末尾,需要跳转到下一章时,它会调用 ttsNextSection() ([anx-reader/lib/page/book_player/epub_player.dart:287]。这个 Dart 方法同样会执行一个名为 ttsNextSection() 的 JavaScript 函数。这个 JS 函数负责处理复杂的逻辑:在当前 WebView 中加载下一章的 HTML 内容 - 渲染新章节的页面 - 定位到新章节的开头 - 返回第一句文本给 TTS 引擎。
2、当应用进入后台或手机锁屏时,为了节省电量和系统资源,iOS 和 Android 都会暂停 WebView 中 JavaScript 的执行。虽然 audio_service 可以让音频在后台继续播放,但当 TTS 引擎播放完当前章节的最后一句,并尝试通过 ttsNextSection() 回调请求下一章内容时,问题就出现了。此时,由于 WebView 处于“休眠”状态,ttsNextSection() 的 JavaScript 调用无法执行或被无限延迟。因此,Dart 端的 TtsHandler 永远等不到下一章的文本数据。最终结果就是,TTS 播放完当前章节后就停止了,无法自动加载并朗读下一章。
结论: 要想实现后台自动跳转章节,必须重构数据获取逻辑,使其摆脱对前台 WebView 的依赖。把tts内容与界面解除耦合,例如,可以在 Dart 层预先解析 EPUB 文件,将章节内容缓存起来,这样 TTS 服务在后台也能直接从内存或数据库中获取下一章的文本,而无需与“休眠”的 WebView 交互。
### To reproduce|重现步骤
1. 打开听书
2. 手机锁屏或后台播放
3. 等待听书到章节结束
4. tts可能暂停(取决于手机的省电策略,后台策略等,可以适当等时间长的后台测试)
5. app恢复前台
6. 恢复播放。
### Expected behavior|预期行为
tts在后台能不中断播放下一章
### Screenshots|截图
_No response_
### Platform (please complete the following information)|平台(请填写以下信息)
- Platform: | 平台:
Android
- OS: | 操作系统:
[e.g. Android13(MIUI14)]
澎湃os2
- AnxReader Version: | 安读版本:
1.8.1
- Device: | 设备:
红米k60
### Additional context|其他信息
_No response_
Hướng dẫn đóng góp
Đánh giá
Issue này chưa được đánh giá.