首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何单击Android上的UI窗口,以及如何使用AccessibilityService进行更高的操作?

如何单击Android上的UI窗口,以及如何使用AccessibilityService进行更高的操作?
EN

Stack Overflow用户
提问于 2019-12-21 22:27:40
回答 1查看 676关注 0票数 5

我遵循了this的建议,以编程方式统一我的所有应用程序,直到Android7.1,一切都很好,但是当我在Android8.1和9上测试相同的程序后,这似乎不起作用( Ui窗口上没有执行任何单击)。发生什么事了呢?在这些版本中对此做了一些更新吗?

主代码>

MyAccessibility:

代码语言:javascript
运行
复制
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 (main):

代码语言:javascript
运行
复制
<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):

代码语言:javascript
运行
复制
<?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" />

编辑:

测试环境:

摩托罗拉(Updated)

  • Motorola
  • G5(S) Plus -Android7.1和8.1
  • G7 Plus -Android9.0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-02 11:41:41

我做了一些测试,并且在尝试卸载Android8及更高版本的应用程序时发现,AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED事件会触发,但是AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED事件不会触发。此外,当您对一个AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED类型的事件调用AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED方法时,它返回null。因此,当getRootInActiveWindow()方法返回null时,我使用了AccessibilityEvent.getSource()方法,此外,在API 26和更高版本上,我还尝试处理AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED事件。

请尝试以下代码:

代码语言:javascript
运行
复制
@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文件以获得更高的准确性。

代码语言:javascript
运行
复制
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
    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"
    android:packageNames="com.google.android.packageinstaller, com.android.packageinstaller"/>

我已经在API 24、API 27、API 28和API 29上测试了这段代码,它起了作用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59440285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档