Как прослушивать краны и получать просмотры с помощью Accessibility в Android?

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

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

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

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

= > Обнаружение отводов на EditText из любого приложения

= > Добавьте значение (string) в те EditText s.

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

Эти приложения, очевидно, используют "Специальные службы" для этого, , но я хотел бы знать, как это реализовать?

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

Ответ 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 файла, подключенного к вашей службе с помощью файла Manifest. Содержимое этого файла:

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