【问题标题】:How click in UI window on Android Oreo and higher with AccessibilityService?如何使用 AccessibilityService 在 Android Oreo 及更高版本的 UI 窗口中单击?
【发布时间】:2020-02-02 19:41:41
【问题描述】:

我已按照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

【问题讨论】:

  • 确保您已为其添加适当的权限。 &lt;uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /&gt; 更多请参考 stackoverflow.com/a/21854473/10835305>
  • +1 这个权限在 Android Pie 上的重要性。但是这个问题的目标(AccessibilityService点击)仍然没有奏效。
  • 确保adb shell pm list packages|grep -i install给你com.android.packageinstaller否则你必须在onServiceConnected方法中使用com.google.android.packageinstaller
  • 这有帮助吗?
  • 嘿@BrowJr,请停止重复编辑您的问题以删除/添加一个字符,从而将您的问题置于最新问题的顶部。相反,使用可以吸引更多人的赏金系统是个好主意。

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


【解决方案1】:

我做了一些测试,发现在 Android 8 及更高版本上尝试卸载应用程序时,AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 事件会触发,但AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED 事件不会触发。另外,当你对AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED类型的事件调用AccessibilityEvent.getSource()方法时,它返回null。所以当AccessibilityEvent.getSource() 方法返回null 时我使用getRootInActiveWindow() 方法,此外在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 上测试了这段代码,它可以工作。

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多