Ответ 1
Я попытался суммировать, как я смог разобраться с этой проблемой в блоге. Любой, кому нужна помощь, может взглянуть на нее.
Доступность Сервиса на следующий уровень
Мой предыдущий ответ был удален модераторами, возможно, из-за того, что я только что разместил ссылку на блог. Поэтому я снова публикую свой ответ с подробностями здесь.
Самый простой способ обеспечивается самим Android. Если вы создаете что-то на собственном приложении, это лучший и самый простой способ сделать это. Вы должны использовать "findAccessibilityNodeInfosByViewId()", как описано ниже
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = source.findAccessibilityNodeInfosByViewId("YOUR PACKAGE NAME:id/RESOURCE ID FROM WHERE YOU WANT DATA");
if (findAccessibilityNodeInfosByViewId.size() > 0) {
AccessibilityNodeInfo parent = (AccessibilityNodeInfo) findAccessibilityNodeInfosByViewId.get(0);
// You can also traverse the list if required data is deep in view hierarchy.
String requiredText = parent.getText().toString();
Log.i("Required Text", requiredText);
}
}
Если вы создаете что-то на других приложениях и не знаете Res ID. Вы должны построить логику с комбинацией родительского элемента, количества дочерних элементов, уровня, на котором находятся ваши данные, типа события. Вы должны искать шаблон в событии или источнике или комбинацию вышеупомянутых значений, чтобы получить необходимые данные. Кроме того, вы должны настроить некоторые настройки в своем коде, чтобы получить точные данные в соответствии с вашей задачей. Как и в нашей задаче, у нас есть некоторое регулярное выражение для получения ценных данных.
Вы должны позаботиться о том, чтобы в случае изменения представления или пользовательского интерфейса или изменения идентификаторов ваша текущая логика могла не работать. Таким образом, вы должны внимательно посмотреть на приложение, на котором вы строите свой сервис. Ниже приведен пример кода, в котором мы получаем данные без идентификатора, которые могут быть полезны для вас, чтобы понять, как они будут работать.
Распечатать источник и событие
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
Log.i("Event", event.toString() + "");
Log.i("Source", source.toString() + "");
}
Получить детскую учетную запись
source.getChildCount();
Если количество детей> 0, возможно, вам придется посмотреть на это.
Пример кода 1
if (level == 0 && source.getClassName().equals("android.widget.TextView") && source.getText()!=null && !source.getText().toString().isEmpty()){
// here level is iteration of for loop
String recivedText = source.getText().toString();
if(source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.FrameLayout") && source.getParent().getParent()==null){
return recivedText;
}
}
Пример кода 2
if (source.getPackageName().equals("PACKAGE NAME OF APP FOR WHICH YOUR EXPECTING EVENT")) {
if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && "COMPLETE NAME OF ACTIVITY CLASS WITH PACKAGE NAME (if you want it for some specific screen)".equals(event.getClassName())){
if(source.getText()!=null && source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.RelativeLayout")&& source.getParent().getParent()!=null && source.getParent().getParent().getClassName().equals("android.widget.ScrollView") && source.getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getClassName().equals("android.support.v4.view.ViewPager")&& source.getParent().getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getParent().getClassName().equals("android.widget.FrameLayout")&& source.getParent().getParent().getParent().getParent().getParent()==null){
return source.getText().toString();
}
}
Это немного неуклюже, но чтобы это заработало, вам нужно заглянуть в логи, чтобы найти шаблон, который приведет вас к нужным данным.
Обновление 20/11/2017 Google приостанавливает все приложения, использующие службы специальных возможностей, для других целей, кроме специальных возможностей. Я получил электронное письмо относительно того же самого для моего приложения, и другие разработчики также получают то же самое электронное письмо от Google (Reddit). Итак, я думаю, что мы должны искать какой-то другой способ сделать что-то, и я прошу вас обновить его и здесь, если кто-то предложит другую реализацию для достижения того же поведения, это также поможет другим.
Спасибо Умеш Чаухан