В моем приложении у меня есть служба специальных возможностей, которая получает корень активного окна перед выполнением дальнейших действий. Соответствующий раздел выглядит так:
@Override
public final void onAccessibilityEvent(AccessibilityEvent event) {
...
AccessibilityNodeInfo rootAccessibilityNode = getRootInActiveWindow();
...
}
Я получаю жалобы от пользователей на ANR, и трассировка стека указывает мне на строку getRootInActiveWindow.
Возможно ли, что getRootInActiveWindow вызывает ANR, и если да, то каков механизм? Нужно ли вызывать этот метод в собственном потоке? В документации об этом ничего нет.
Ответ 1 · рейтинг 1 · ChrisCM
Я очень сомневаюсь, что эта строка является прямой причиной сбоя, все же хочу увидеть трассировку стека. Также было бы полезно знать, как вы запускаете свой сервис (разработчики, плохо знакомые со службами специальных возможностей, часто ошибаются). Предполагая, что вы сделали домашнее задание по обычным очевидным ответам, у нас осталось следующее:
О: Проблемы с разрешениями. Если вы проводили тестирование на рутированных устройствах или на чем-то еще, возможно, у ваших пользователей возникают проблемы с разрешениями. Убедитесь, что у вас есть android:canRetrieveWindowContent="true" в XML-файле конфикса службы.
B: Если вы не отфильтровали какие-либо события специальных возможностей, есть события, которые запускаются между загрузками окон и т.п. Возможно, вы пытаетесь захватить контент, которого там нет, и системе это не нравится. Это также можно скрыть, проведя тестирование на эмуляторах, поскольку это может быть состояние гонки, которое не проявляется в более медленной эмулируемой среде. Это также может привести к проблемам с производительностью, поскольку иерархия узлов является достаточно дорогостоящей вещью для обхода, и вы не хотели бы делать это часто. Попробуйте ограничить accessibilityEventTypes, на которых выполняется ваш код.