对于 Android 14 上 filterTouchesWhenObscured 标志为 true 的应用,不会报告辅助功能服务信息

问题描述 投票:0回答:1

我的应用程序依赖于辅助功能事件(例如,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 accessibility accessibilityservice android-14
1个回答
0
投票

我在【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的应用程序设置此设置,而他们没有明确请求它!超级烦人。

© www.soinside.com 2019 - 2024. All rights reserved.