为什么 getRootInActiveWindow() 在 Accessibility Event 中总是返回 null

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

我已经尝试了AccessibilityServiceConfig.xml的所有排列和组合。这是 AccecssibilityService 和 AccessibilityServiceConfig.xml 的代码。

这是我的代码:

@Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
    
AccessibilityNodeInfo rootNode = getRootInActiveWindow();

}

@Override
    protected void onServiceConnected(){
        super.onServiceConnected();
         AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.eventTypes                 = AccessibilityEvent.TYPES_ALL_MASK;
        info.feedbackType               = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
        info.notificationTimeout        = 1000;
        info.flags                      = AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
        this.setServiceInfo(info);
        Log.e(TAG,"onServiceConnected: ");
    }

AccessibilityServiceConfig.xml:

<?xml version="1.0" encoding="utf-8"?>

    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:accessibilityEventTypes="typeWindowsChanged|typeWindowContentChanged|typeViewScrolled"
        android:accessibilityFlags="flagReportViewIds|flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
        android:canPerformGestures="true"
        android:canRetrieveWindowContent="true"
        android:canRequestFilterKeyEvents="false"
        android:accessibilityFeedbackType="feedbackAllMask"
        android:notificationTimeout="1000"
        android:canRequestEnhancedWebAccessibility="true">
    </accessibility-service>

我一直在使用 Samsung S21 Ultra 来测试该应用程序。

android accessibility accessibilityservice
1个回答
0
投票

我以前使用过一次辅助服务,所以我分享我的 xml 和代码文件(当我检查时它正在工作)。我使用 getRootInActiveWindow() 函数,如下所示: accessibility_service.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:notificationTimeout="200"
    android:accessibilityFlags="flagDefault|flagRequestAccessibilityButton|flagIncludeNotImportantViews|flagReportViewIds|flagRetrieveInteractiveWindows|flagRequestFilterKeyEvents"
    android:canRetrieveWindowContent="true"
    android:canRequestFilterKeyEvents="true"
    />

AccessibilityService.java

class MyAccessibilityService extends AccessibilityService {
    public static instance;

    @Override
    public void onServiceConnected() {
        instance = this;
        //Your other code.
    }
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        AccessibilityNodeInfo info = event.getSource();
        AccessibilityNodeInfo root = instance.getRootInActiveWindow();
        if (root != null) {
            // Do whatever you want with root Node.
            Log.d("NotNull","Root Node is not null");
        }
    }
}

注意: 当您在各个窗口之间转换时,很多时候 root 返回 null。这就是为什么我们要检查 root!=null,但大多数时候它不为 null。

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