У меня есть простая служба специальных возможностей, которая показывает имя класса представления, которое вызвало событие доступности:
class TestService : AccessibilityService() {
override fun onInterrupt() {
//Do nothing
}
override fun onAccessibilityEvent(event: AccessibilityEvent?) {
val source = event?.source?.className.toString()
println(source)
Toast.makeText(this, source, Toast.LENGTH_SHORT).show()
}
}
и XML
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeViewFocused"
android:accessibilityFeedbackType="feedbackGeneric"
android:canRetrieveWindowContent="true"
android:accessibilityFlags="flagDefault" />
Все работает нормально, но Я заметил, что если есть и другая активированная служба доступности (Dashlane, LastPass или 1Password), сервис показывает разные результаты.
Я использую браузер Samsung inte rnet (https://play.google.com/store/apps/details?id=com.sec.android.app.sbrowser&hl=en) для запуска событий специальных возможностей, щелкая поля ввода текста. Хотя включена только моя служба доступности, я получаю, что источником события является FrameLayout
, который представляет весь веб-контент в браузере. Однако, если включена одна из ранее упомянутых служб, я получаю, что источником события был EditText
, который является точным представлением, на которое я нажал. Позже я хотел бы, чтобы мой сервис работал, без необходимости включения других сервисов.
Сервисы специальных возможностей раньше могли запрашивать javascript средство чтения с экрана для внедрения в Интернет. содержимого, указав android:canRequestEnhancedWebAccessibility="true"
и добавив flagRequestEnhancedWebAccessibility
в xml, но эта функциональность устарела начиная с API 26 (https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo#CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY). Тем не менее, я попытался добавить их, но безуспешно.
После того, как несколько дней врезался головой в стену, я попытался установить свое приложение, используя идентификатор приложения LastPass com.lastpass.lpandroid
. И к моему удивлению - это сработало. Мой сервис получал события с правильными источниками, указанными в них. Обратите внимание, что никакая другая служба специальных возможностей не была включена, а также не было добавлено android:canRequestEnhancedWebAccessibility="true"
к xml службы. Я пытался сделать то же самое с другими идентификаторами приложений, и это работало с com.dashlane
и com.agilebits.onepassword
тоже. Как только я установил свой сервис с другим идентификатором приложения, он перестал работать.
Итак, мой вопрос: существует ли какой-то белый список идентификаторов приложений в android, который позволяет javascript внедрять в веб-контент если в этом приложении включена служба специальных возможностей? Или это поведение может быть как-то связано с https://github.com/openid/OpenYOLO-Android проектом? Или это какой-то другой функционал, о котором я не знаю?
Вы можете воспроизвести его, используя https://github.com/arnas91/accessibility-service-test