Служба специальных возможностей: получить представления, с которыми вы можете взаимодействовать мгновенно (так же, как голосовой доступ)? - PullRequest
6 голосов
/ 12 июня 2019

Цель состоит в том, чтобы получить представления, с которыми можно мгновенно взаимодействовать с (по которым можно щелкнуть прямо сейчас и что-то произойдет).Если вид в общем случае видим и доступен для щелчка, но скрыт другим видом / меню / боковой панелью, его следует опустить.

Голосовой доступ .И похоже, что он использует Accessibility API.

Прекрасным примером является нижнее меню в Google Maps.Когда он расширяется, кнопка «Поиск по маршруту» внизу все еще видна, но она не выделена приложением.


Так что же у нас есть?
  • Существует поток AccessibilityEvent .Наиболее полезным является AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED , поэтому мы можем получать уведомления, когда что-то происходит.
  • С помощью getSource () мы можем получить экземпляр AccessibilityNodeInfo, который вызвал событие.Или мы можем получить корень окна с помощью AccessibilityService.getRootInActiveWindow () .И имея это, мы можем обойти всю иерархию в приложении.
  • AccessibilityNodeInfo не предоставляет никакой информации о z-порядке представлений, поэтому невозможно понять, что вышеи что под ним.
  • Нижнее меню находится в том же окне (оно не модальное).
  • Если вы попытаетесь нажать кнопку «Поиск по маршруту», когда нижнее меню развернуто,нижнее меню рушится.Таким образом, вы не можете щелкнуть его, он находится под меню.
  • Я просмотрел все параметры AccessibilityNodeInfo , например isVisibleToUser(), isClickable(), isContextClickable(), isSelected(), isFocusable(), isFocused(), isAccessibilityFocused() и кнопка имеет те же параметры, когда нижнее меню свернуто / развернуто.Он виден пользователю, доступен для фокусировки и нажатия.

  • Я изучил скрытые API и не вижу ничего полезного.

Чего мне не хватает?


enter image description here

Ответы [ 2 ]

1 голос
/ 19 июня 2019

AccessibilityNodeInfo # getDrawingOrder (), вероятно, поможет вам. Обратите внимание, что вам нужно выполнить обход дерева, чтобы определить, что находится над чем.

Есть еще угловые шкафы с прозрачными ракурсами, которые доставят вам неприятности, но вам придется пройти 95% пути. Мы работаем над лучшим ответом для этого случая.

1 голос
/ 18 июня 2019

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

...