Android TalkBack 重复说 "Service [my app name]"

Android TalkBack says repeatedly "Service [my app name]"

我有一个很受欢迎的朗读应用程序,视障人士和盲人也经常使用它。有些人,很少有人抱怨说,当使用该应用程序或让它大声朗读时,它会反复说 "Service at Voice"(我的应用程序的名称是@Voice Aloud Reader)。我在不同版本 Android 和启用了 TalkBack 的多部手机上对此进行了测试,但无法重现此问题。

该应用程序正在显示一个通知,其中包含阅读进度和 pause/resume、快进和倒退等按钮。当然,所有朗读都是通过服务完成的,而不是 activity,因为用户可能想要关闭我的 activity,甚至关闭屏幕,但仍然可以收听。我很乐意 post 更多技术细节,但不知道哪些是相关的。

我尝试搜索术语的任意组合 "TalkBack saying 'service' repeatedly",但找不到任何相关内容。就此事与我联系的用户在 TalkBack 应用程序中找不到任何设置来停止说这句话。谁能阐明这个问题?

我敢打赌,每次创建 MainActivity 时,它都会在方向更改时宣布应用程序名称。

SO link

我找到了我的问题的原因,一部分是我自己的应用程序代码,一部分是 Android 系统和 TalkBack 在不同设备上的混淆行为。这是正在发生的事情:

应用程序 @Voice Aloud Reader 读取加载到其中的文本(网页、文档、书籍)并突出显示它大声朗读的句子。在每次更改句子时,它都会在自己的屏幕上(如果可见)和通知中更新进度。通知更新代码很旧,从 Android 4 天开始。当时我不知道如何更新通知的内容,在我看来,唯一的更新方法是在使用 NotificationBuilder 更新内容后,再次调用我的服务:

startForeground(/* id: */ 1000, myNotifBuilder.build());

多年来一直很好用,在 TalkBack 下也没有问题。即使在今天,我在至少 5 台测试设备上使用 Android 5 到 9 并使用仿真器激活 TalkBack,它仍能正常工作。但一些用户报告说,在阅读每个新句子(进度更新)时,TalkBack 会说 "Service @Voice"。最后更新代码如下,用户反馈问题解决:

        if (newNotification) {
            startForeground(/* id: */ 1000, myNotifBuilder.build());
        }
        else {
            NotificationManagerCompat.from(this).notify(1000, myNotifBuilder.build());
        }

我怀疑这些知识是否会对很多人有所帮助,现在对通知的记录更好,并且在 Google 开发人员文档中有一个清晰的 "Update notification" 章节解释了如何正确执行此操作。