java - AccessibilityService 可以在不打开应用程序的情况下对后台应用程序执行点击事件吗

标签 java android accessibilityservice

在我的 MainActivity 中,我使用 AccessibilityService 在另一个应用程序上执行单击事件,当我打开该应用程序并将其显示在屏幕上时,它会起作用。但是我想在不打开应用程序的情况下执行点击事件,它可以打开但当前不显示在屏幕上。

这可能吗?

public class DiaryAppAccessibilityService extends AccessibilityService {


@Override
protected void onServiceConnected() {
    super.onServiceConnected();
}

@Override
public void onAccessibilityEvent (AccessibilityEvent event) {


    if (getRootInActiveWindow () == null) {
        return;
    }

    AccessibilityNodeInfoCompat rootInActiveWindow = AccessibilityNodeInfoCompat.wrap (getRootInActiveWindow());

    List<AccessibilityNodeInfoCompat> messageNodeList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.diaryapp:id/entry");
    if (messageNodeList == null || messageNodeList.isEmpty ()) {
        return;
    }

    AccessibilityNodeInfoCompat messageField = messageNodeList.get (0);

    if (messageField.getText () == null || messageField.getText ().length () == 0
            || !messageField.getText ().toString ().endsWith (getApplicationContext ().getString (R.string.diaryapp_suffix))) { // So your service doesn't process any message, but the ones ending your apps suffix
        return;
    }

    List<AccessibilityNodeInfoCompat> sendMessageNodeInfoList = rootInActiveWindow.findAccessibilityNodeInfosByViewId ("com.diaryapp:id/send");
    if (sendMessageNodeInfoList == null || sendMessageNodeInfoList.isEmpty ()) {
        return;
    }

    AccessibilityNodeInfoCompat sendMessageButton = sendMessageNodeInfoList.get (0);


    // Now fire a click on the send button
    sendMessageButton.performAction (AccessibilityNodeInfo.ACTION_CLICK);

    @Override
    public void onInterrupt() {

    }
}

XML 配置

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
  android:accessibilityEventTypes="typeWindowContentChanged"
  android:accessibilityFeedbackType="feedbackSpoken"
  android:accessibilityFlags="flagDefault"
  android:notificationTimeout="100"
  android:canRetrieveWindowContent="true"
</accessibility-service>

我删除了这个

android:packageNames="com.diaryapp"

因为我希望该服务在其他应用程序中处于 Activity 状态,并且能够从那里执行点击事件。

最佳答案

您想要做的事情在设计上是不可能的。 Accessibility API 旨在帮助残障人士与手机上显示的 UI 进行交互。

关于java - AccessibilityService 可以在不打开应用程序的情况下对后台应用程序执行点击事件吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55711069/

相关文章:

java - 数据没有被插入到我的 SQL 表中,但它还说存在重复的主键

android - 我什么时候应该将数据保存到 SQLite 中,输入到我的 Android 应用程序的 fragment 中?

android - 谷歌地图 Android API v2 : My location marker always over other markers?

android - 使用 AccessibilityService 在屏幕上执行滑动

android - 类似于24以下的GestureDescription执行点击,滑动, throw ?

java - 我在哪里可以找到权威的 Selenium WebDriver 到 Firefox 兼容性矩阵?

java - 为什么 Eclipse 不编译我的 Web 应用程序?

java - 加密和解密字符串

Android OpenGL queueEvent 为什么?

android - 在 Toast 中自定义 Android 对讲