Anxcye / Anxcye/anx-reader

[Bug]: tts听书的下一章内容获取依赖于前台运行的界面实例,导致app后台或者手机锁屏时tts听书不会自动跳转到下一章节

Đang mở
#544 6 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug P1
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

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.