Вопрос или проблема
Я пытаюсь получить баланс приложения Google Pay, используя фреймворк службы доступности. Но когда дело доходит до банковского баланса, служба не может получить дочерний узел. Похоже, что экран защищен. Тем не менее, я могу получить элемент с помощью Appium.
Есть ли способ получить данные, используя службу доступности?
Я попытался установить
android:canRetrieveWindowContent=”true”
в serviceconfig.xml
но это ничего не изменило.
Минимальный воспроизводимый пример:
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo mSource = event.getSource();
boolean ifHome = false;
int eventType = event.getEventType();
String pkgname = event.getPackageName() == null ? "" : event.getPackageName().toString();
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
}
Ответ или решение
Для получения информации о дочерних узлах события доступности (Accessibility Event) в приложении, которое, похоже, защищено, важно понимать, что многие современные приложения, такие как Google Pay, используют различные методы защиты данных, чтобы предотвратить доступ к их контенту посредством сторонних сервисов, включая услуги доступности.
Вот несколько рекомендаций и шагов, которые могут помочь решить вашу проблему:
1. Проверьте разрешения службы доступности
Убедитесь, что ваша служба доступности имеет все необходимые разрешения. Возможно, вам потребуется предоставить дополнительные разрешения в настройках устройства, помимо указанного android:canRetrieveWindowContent="true"
.
2. Используйте правильные события
Следите за событиями, которые могут содержать информацию о дочерних узлах. Например, вы можете попробовать фильтровать события по типу TYPE_WINDOW_CONTENT_CHANGED
, чтобы отслеживать изменения в окнах и получать актуальное представление элементов интерфейса.
3. Читайте содержимое узлов
Если event.getSource()
возвращает пустой узел, попробуйте получить корневой узел, как вы делаете в своем примере с getRootInActiveWindow()
, и после этого использовать метод findAccessibilityNodeInfosByViewId()
для поиска конкретных элементов по идентификаторам представлений (View IDs).
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
super.onAccessibilityEvent(event);
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
if (rootNode != null) {
List<AccessibilityNodeInfo> nodeList = rootNode.findAccessibilityNodeInfosByViewId("id_of_the_balance_view");
// Обработка найденных узлов
for (AccessibilityNodeInfo node : nodeList) {
// Здесь вы можете получить текст, идентификатор и т.д.
String balance = node.getText().toString();
Log.d("Balance", "Current balance is: " + balance);
}
}
}
4. Используйте доступные методы
Обратите внимание на методы для обхода узлов, такие как getChild()
и getParent()
. С помощью их можно обходить структуру узлов, если вам не удается получить определенные элементы из-за защиты.
5. Убедитесь в совместимости устройств
Некоторые устройства могут иметь ограниченные возможности для доступа к данным из-за реализованных на уровне системы политик безопасности. Проверяйте ваше решение на разных устройствах и версиях Android.
6. Обратитесь к документации Google
Обратите внимание на генерируемую документацию Google по Accessibility Services и по работе с защищенными данными. Некоторые элементы могут быть недоступны, и о таких случаях может быть упомянуто в официальной документации.
Заключение
Работа с службами доступности в современных приложениях крайне сложна и может ограничиваться уровнями безопасности. В случае с финансовыми приложениями наличие таких ограничений не является исключением. Возможно, вам придется рассмотреть другие методы взаимодействия с данным приложением или использовать более специализированные инструменты, помимо службы доступности.
Если ни одно из предложений не сработает, стоит задуматься о том, насколько эти данные критичны и следует ли их извлечение в рамках действующих норм безопасности и конфиденциальности.