Может ли AccessibilityService выполнить событие щелчка в фоновом приложении, не открывая приложение - PullRequest
0 голосов
/ 16 апреля 2019

В своей функции 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 config

<?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"

, потому что я хочу, чтобы служба была активна в других приложениях и могла оттуда выполнять событие нажатия.

1 Ответ

1 голос
/ 18 апреля 2019

То, что вы пытаетесь сделать, не возможно по замыслу.Accessibility API предназначен для того, чтобы помочь людям с ограниченными возможностями взаимодействовать с пользовательским интерфейсом, отображаемым на телефоне.

...