android - 如何使用 AccessibilityService 在 Android Oreo 及更高版本的 UI 窗口中单击?

标签 android android-9.0-pie accessibilityservice android-8.1-oreo

我关注了this建议以编程方式卸载我的应用程序,并且在 Android 7.1 之前一切正常,但是在我在 Android 8.1 和 9 上测试相同之后,这似乎不起作用(在 Ui 窗口上未执行任何点击)。发生了什么?在这些版本中对此进行了一些更新?

主要代码 >

我的可访问性:

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(无障碍服务):
<?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" />

编辑:

测试环境:
  • 摩托罗拉 G5(S) Plus - Android 7.1 和 8.1(更新)
  • 摩托罗拉 G7 Plus - Android 9.0
  • 最佳答案

    在尝试卸载 Android 8 及更高版本上的应用程序时,我做了一些测试,发现 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED事件触发但 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED事件不会触发。另外,当您调用AccessibilityEvent.getSource() AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 事件的方法类型,它返回null。所以我用了getRootInActiveWindow() AccessibilityEvent.getSource() 时的方法方法返回 null 并且在 API 26 及更高版本上,我尝试处理 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文件以及更高的准确性。
    <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 上测试了这段代码并且它工作正常。

    关于android - 如何使用 AccessibilityService 在 Android Oreo 及更高版本的 UI 窗口中单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59440285/

    相关文章:

    android - 在后台自动回复 WhatsApp 消息

    android - 通过无障碍服务使用 UiAutomation

    java - 如何将一个android studio项目合并到另一个android studio项目中

    android P 中的 android AppComponentFactory - 如何围绕外部 Activity 包装/装饰功能

    java - 将 Firebase 字段数组转换为列表

    android - Android P 上的 Fingerprint BiometricPrompt 从 View

    应用程序后台模式下的 Android BLE 扫描,广告数据包未检测到信标正在检测

    Android 对讲问题

    android - 在 ListView 上实现 Chris Banes 的下拉刷新和水平滑动

    android - Scrollview 在软输入键盘的回车键上自动滚动