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

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

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

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

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

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

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

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

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

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

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

Ниже приведен обратный вызов 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