我的应用程序依赖于辅助功能事件(例如,AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 或 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED)以及屏幕上 AccessibiltyNodeInfo 对象中的信息,以便检测正在使用的其他应用程序。
从 Android 14 开始,系统不再报告已将“filterTouchesWhenObscured”设置为 true 的应用程序的任何辅助功能事件。通过 getWindows() 和accessibilityWindowInfo.getRoot() 检索到的AccessibilityNodeInfo 也为null!
但是,只有当将标志设置为整个窗口时,这才是真正的问题:
getWindow().getDecorView().setFilterTouchesWhenObscured(true);
我不知道为什么这个标志,它应该在视图被遮挡时防止窃听,会影响可访问性事件。
有人可以提供连接,以便我们找到可能的解决方法或修复吗?
我在【Android源码查看类】[2]中找到了这个方法:
void calculateAccessibilityDataSensitive() {
// Use the explicit value if set.
if (mExplicitAccessibilityDataSensitive != ACCESSIBILITY_DATA_SENSITIVE_AUTO) {
mInferredAccessibilityDataSensitive = mExplicitAccessibilityDataSensitive;
} else if (getFilterTouchesWhenObscured()) {
// Views that set filterTouchesWhenObscured default to accessibilityDataSensitive.
mInferredAccessibilityDataSensitive = ACCESSIBILITY_DATA_SENSITIVE_YES;
} else if (mParent instanceof View && ((View) mParent).isAccessibilityDataSensitive()) {
// Descendants of accessibilityDataSensitive Views are also accessibilityDataSensitive.
mInferredAccessibilityDataSensitive = ACCESSIBILITY_DATA_SENSITIVE_YES;
} else {
// Otherwise, default to not accessibilityDataSensitive.
mInferredAccessibilityDataSensitive = ACCESSIBILITY_DATA_SENSITIVE_NO;
}
}
设置了filterTouchesWhenObscured的视图默认被视为accessibilityDataSensitive,这是在Android 14中添加的。我不知道为什么他们会默认为设置了filterTouchesWhenObscured的应用程序设置此设置,而他们没有明确请求它!超级烦人。