如何通过AccessibilityService在Android Oreo及更高版本上的UI窗口中单击?

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

我遵循了this的建议,以编程方式取消安装我的应用程序,并且一切正常,直到Android 7.1,但是在我在Android 8.1和9上对其进行测试后,这似乎不起作用(在Ui窗口上未单击任何操作)。发生了什么?在这些版本中对此做了一些更新?

主要代码>

MyAccessibility:

public void onAccessibilityEvent(AccessibilityEvent event) {

 AccessibilityNodeInfo source = event.getSource();

    if (source == null) {
        return;
    }

    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {

        List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByViewId("android:id/button1");
        for (AccessibilityNodeInfo node : list) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
   }

}

XML(主要):

<service
            android:name=".MyAccessibility"
            class=".MyAccessibility"
            android:enabled="true"
            android:exported="false"
            android:label="@string/accessibility_service_label"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action
                    android:name=".MyAccessibility"
                    android:value=".MyAccessibility" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>

            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessibility_service_config" />
        </service>

XML(AccessibilityService):

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

<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews|flagReportViewIds"
    android:canPerformGestures="true"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_service_description"
    android:notificationTimeout="100"
    tools:ignore="UnusedAttribute" />

编辑:

测试环境:

  • Motorola G5(S)Plus-Android 7.1和8.1(更新)
  • Motorola G7 Plus-Android 9.0
android android-9.0-pie accessibilityservice android-8.1-oreo
1个回答
0
投票
[我进行了一些测试,并弄清楚了在尝试卸载Android 8及更高版本上的应用程序时,触发了AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED事件,但没有触发。另外,当您在AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED类型的事件上调用AccessibilityEvent.getSource()方法时,它返回null。因此,当AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED方法返回null时,我使用了getRootInActiveWindow()方法,此外,在API 26及更高版本上,我也尝试处理AccessibilityEvent.getSource()事件。请尝试以下代码:

AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED

我也修改了@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    AccessibilityNodeInfo source = event.getSource();

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && source == null)
        source = getRootInActiveWindow();

    if (source == null) {
        return;
    }

    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByViewId("android:id/button1");
        for (AccessibilityNodeInfo node : list) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }
}
文件以提高准确性。

accessibility_service_config.xml

我已经在API 24,API 27,API 28和API 29上测试了此代码,并且有效。

-1
投票
known bug的新实现中有一个AccessibilityService,其中某些事件仍然未被检测到。这里可能发生的情况是该服务可能无法拾取卸载对话框窗口。

解决方案是使用FLAG_RETRIEVE_INTERACTIVE_WINDOWS,它采用单独的代码路径并规避此错误。

FLAG_RETRIEVE_INTERACTIVE_WINDOWS中,在accessibility_service_config.xml下添加flagRetrieveInteractiveWindows

accessibilityFlags

检查上面的代码更改,看看是否有效?这应该允许发送点击事件。
© www.soinside.com 2019 - 2024. All rights reserved.