我有一个通过TTS读取通知的应用。随着谷歌改变使用辅助功能的应用政策,我改用了通知监听器,虽然这意味着我必须删除读取吐司信息的选项。我昨晚发布了这个更新,并且已经收到了想要吐司功能的人的反馈。
有没有办法在不使用辅助功能的情况下读取Toast消息?我对解决方案的搜索空洞了。
更新(2018-01-16)
在深入研究Android源代码后,我在Toast类(API 27)中找到了这个相关的方法:
private void trySendAccessibilityEvent() {
AccessibilityManager accessibilityManager =
AccessibilityManager.getInstance(mView.getContext());
if (!accessibilityManager.isEnabled()) {
return;
}
// treat toasts as notifications since they are used to
// announce a transient piece of information to the user
AccessibilityEvent event = AccessibilityEvent.obtain(
AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);
event.setClassName(getClass().getName());
event.setPackageName(mView.getContext().getPackageName());
mView.dispatchPopulateAccessibilityEvent(event);
accessibilityManager.sendAccessibilityEvent(event);
}
这清楚地表明,如果没有启用可访问性服务,则不会将Toast调度到AccessibilityService使用的处理程序,因此在没有启用任何服务的情况下,无法以可访问性获取它们的某种方式访问toast。当然,我试图避免再次创建辅助功能服务,并且不希望依赖于启用了不同服务的用户。
看来如果有任何方式可以访问没有辅助功能的toast,可能需要进行一些相当复杂的反映才能到达Toast$TN.mNextView
或.mView
到com.android.server.NotificationManagerService.mToastQueue
和{{1} }。我现在有点头脑,因为我对反射不太熟悉,但我还在挖掘。