getRootInActiveWindow()给出空值

0 人关注
 private void click() {
        Log.d(TAG, String.format("Click [%d, %d]", cursorLayout.x, cursorLayout.y));
- AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
        if (nodeInfo == null) return;
        AccessibilityNodeInfo nearestNodeToMouse = findSmallestNodeAtPoint(nodeInfo, cursorLayout.x, cursorLayout.y + 50);
        if (nearestNodeToMouse != null) {
            logNodeHierachy(nearestNodeToMouse, 0);
            nearestNodeToMouse.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        nodeInfo.recycle();

我正在使用 AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); 我在这里得到空值

I try

view.createAccessibilityNodeInfo();

通过这些方法,我得到了节点。但我得到了一个错误,即无法到达。

view.getRootView().createAccessibilityNodeInfo();

xml文件的可访问性

宣言文件(ManifestFile

4 个评论
你能分享你的 无障碍服务配置 file contents?
yes where to send
你可以修改这个问题,或者放一个git仓库的链接 :)
我附上了可及性xml和服务menifiest文件的屏幕截图。
android
accessibility
android-service
android-view
android-windowmanager
Nripender Kumar
Nripender Kumar
发布于 2022-12-07
2 个回答
Quintin Balsdon
Quintin Balsdon
发布于 2022-12-26
0 人赞同

从评论中,我似乎无法让你显示你的服务配置的内容......我不想用我的来迷惑你,但我觉得这个例子可能更有成效。

在你的清单中,你需要有一个 accessibility_service_config 文件被引用。名称并不重要。

<service
    android:name="..."
    android:enabled="true"
    android:label="..."
    android:description="..."
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
    android:exported="true">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_service_config" />
</service>

那么res/xml/accessibility_service_config.xml就需要按照以下的思路来进行

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:accessibilityFlags="flagDefault|flagReportViewIds"
    android:accessibilityEventTypes="typeAllMask"
    android:canPerformGestures="false"
    android:canRetrieveWindowContent="true"
    android:description="..."

可能是你只需要把canRetrieveWindowContent设置为真。文件:

属性是无障碍服务是否希望能够检索活动窗口的内容。这个设置在运行时不能被改变。

要求允许设置#无障碍服务Info#FLAG_RETRIEVE_INTERACTIVE_WINDOWS旗帜。

可以是一个布尔值,如 "真 "或 "假"。

也可能是需要的内容,至少android:accessibilityFlags="flagReportViewIds"

根据文件:

这个标志要求可访问性节点信息(AccessibilityNodeInfos由一个无障碍服务包含源视图的ID。源视图的id将是一个完全合格的资源名称,形式为 "package:id/name",例如 "foo.bar:id/my_list",它对UI测试自动化很有用。这个标志在默认情况下是不设置的。

我强烈建议你正确配置你的服务--我不建议逐字复制和粘贴我的服务配置。

我尽力去获取窗口内容,但我仍然没有得到。我在这里分享我的github github.com/mkumar7404508129/accesibility 请检查一下,告诉我这个错误。
Quintin Balsdon
Quintin Balsdon
发布于 2022-12-26
0 人赞同

你的服务配置XML是畸形的。

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"> <-- the angle bracket shouldn't be here -->
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagDefault|flagReportViewIds"
    android:canPerformGestures="true"
    android:canRetrieveWindowContent="true"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:notificationTimeout="200"
    android:packageNames="com.example.accesibility"
    android:canRequestEnhancedWebAccessibility="true"
</accessibility-service>
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagDefault|flagReportViewIds"
    android:canPerformGestures="true"
    android:canRetrieveWindowContent="true"
    android:accessibilityFeedbackType="feedbackAllMask"