Как прослушивать нажатия и получать просмотры с помощью специальных возможностей в Android?

Я хочу реализовать службу специальных возможностей в своем приложении для Android, которая может выполните следующие действия:

=> Получайте касания/клики на экране в любых приложениях.

=> Получить представление, которое было нажато / нажато.

Сначала я думал, что это невозможно сделать из соображений безопасности, но, проводя некоторые исследования, я наткнулся на приложение (Собственный буфер обмена), который может выполнять следующие действия:

=> Обнаружение нажатий на EditTexts из любого приложения

=> Добавить значение (строку) к этим EditText.

Я также видел обратную связь Google. который говорит все, что вы нажмете. Чтобы он мог говорить, ему необходимо получить доступ к представлению (чтобы получить текст) между приложениями.

Очевидно, что эти приложения используют для этого «службы специальных возможностей», но мне хотелось бы знать, как это реализовать?

В основном я нахожу учебные пособия или материалы для вещей, которых мне нужно достичь, но я изо всех сил пытаюсь найти некоторые из них для реализации службы специальных возможностей для моего приложения. Я посетил официальную документацию Android, которая слишком техническая для такого новичка, как я. (Изначально я предпочитаю учиться на Youtube, SO и обучающих сайтах). Также было бы здорово, если бы вы указали мне на другие уроки, посвященные этим вещам.


person Srujan Barai    schedule 16.07.2016    source источник


Ответы (1)


Службы специальных возможностей довольно плохо документированы, но я создал некоторый шаблонный код службы специальных возможностей, который настраивает начальный проект и регистрирует базовые обратные вызовы. Вот немного кода, который, я думаю, вам небезразличен, учитывая ваши конкретные вопросы. Строительные леса, настроенный проект и все такое я оставляю на репозиторий.

Ниже показан обратный вызов onAccessibilityEvent. Здесь вы будете прослушивать различные типы событий, и это наиболее удобное место для захвата содержимого экрана для большинства сценариев. Хотя, как служба доступности, вам также не нужно ждать событий. Вы могли бы так же легко создать AsynTask и захватить его на каком-то интервале.

public void onAccessibilityEvent(AccessibilityEvent event) {
    CLog.d(event.toString());

    switch (event.getEventType()) {
        //On Gesture events print out the entire view heirarchy!

        case AccessibilityEvent.TYPE_GESTURE_DETECTION_START:
            CLog.d(A11yNodeInfo.wrap(getRootInActiveWindow()).toViewHeirarchy());

        case AccessibilityEvent.TYPE_VIEW_CLICKED:
            CLog.d(event.getSource().toString());

        default: {
            //The event has different types, for you, you want to look for "action clicked"
            if (event.getSource() != null) {
                CLog.d(A11yNodeInfo.wrap(event.getSource()).toViewHeirarchy());
            }
        }
    }
}

Я укажу на одну часть конфигурации для этого, потому что это очень важно. Службы специальных возможностей лучше всего настраиваются с помощью XML-файла, подключенного к вашей службе через файл манифеста. Содержимое этого файла:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service 
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagReportViewIds"
android:canRetrieveWindowContent="true"
android:canRequestTouchExplorationMode="true"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:settingsActivity="com.moba11y.basicaccessibilityservice.SettingsActivity"
/>

Для вас важны биты canRetrieveWindowContent="true" и accessibilityEventTypes="typeAllMask". Что мне нравится в дизайне, так это то, что вы хватаетесь за минимальный набор типов событий, которые вам нужны. Различные события специальных возможностей сообщают о совершенно разных результатах. Например, многие события возвращают "null" из getSource(). Это заставляет вас добавлять много фильтров для этого или рисковать исключениями нулевого указателя. Это очень раздражает.

Последнее, что вам нужно, — это действия со специальными возможностями. Это то, что позволяет вам имитировать клики, длинные клики и добавлять текст в редактируемое текстовое представление. Ниже приведен код, который позволяет вам это сделать.

public void onAccessibilityEvent(AccessibilityEvent event) {
    AccessibilityNodeInfo source = event.getSource();
    if (source != null & event.getClassName().equals("android.widget.EditText")) {
        Bundle arguments = new Bundle();
        arguments.putCharSequence(
            AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,"some value");
        source.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
    }
}

https://github.com/chriscm2006/Android-Accessibility-Service-Boilerplate

person ChrisCM    schedule 24.04.2017
comment
Я не понял, откуда взялся этот материал A11yNodeInfo, но, тем не менее, этот ответ действительно помог мне... спасибо - person Zohar; 03.04.2019
comment
A11y — это сокращение от Accessibility. Это длинное слово. - person ChrisCM; 03.04.2019