Я обновляю свое приложение для Android для поддержки Android 14. Приложение можно обновить с помощью CMS (система управления контентом). Когда приложение не является владельцем устройства, пользователи могут включить опцию автоматического обновления. Включение этой опции требует, чтобы пользователь активировал службу доступности, предоставленную моим приложением. Эта служба предназначена для автоматического приема обновлений приложений путем обнаружения диалогового окна PackageInstaller, поиска кнопки «OK» (или «Обновление»), и программно нажав ее. /> Выполнение действия нажатия на кнопке с использованием vicalbibilityndeinfo.performaction (доступность nodeinfo.action_click). < /p>
Однако на Android 14 кнопка «OK» или «Обновление» больше не обнаруживается в иерархии узла доступности. Я зарегистрировал иерархию диалога, и кажется, что кнопка либо скрыта, либо не включена в Дерево доступности. Вот зарегистрированная иерархия: < /p>
null - android.widget.FrameLayout - null - null
com.android.packageinstaller:id/alertTitle - android.widget.TextView - iGotcha Signage Player - null
com.android.packageinstaller:id/install_confirm_question_update - android.widget.TextView - Do you want to update this app? - null
com.android.packageinstaller:id/buttonPanel - android.widget.ScrollView - null - null
com.android.packageinstaller:id/button2 - android.widget.Button - Cancel - null
< /code>
Как вы можете видеть, кнопка «ОК» или «Обновление» отсутствует, в то время как кнопка «Отмена» (кнопка2) присутствует. Это ошибка, или есть новые ограничения в Android 14, которые не позволяют службам доступности взаимодействовать с системными диалогами? Есть ли обходные пути для программного приема обновлений приложений в этом сценарии? < /P>
private fun appUpdateDialogOkButton(e: AccessibilityEvent): AccessibilityNodeInfo? =
e.source!!.findAccessibilityNodeInfosByViewId("android:id/button1").firstOrNull()
?: e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/ok_button").firstOrNull()
?: e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/button1").firstOrNull()
private fun logNodeHierarchy(node: AccessibilityNodeInfo, indent: String) {
AppLog.debug("$indent${node.viewIdResourceName} - ${node.className} - ${node.text} - ${node.contentDescription}")
for (i in 0 until node.childCount) {
node.getChild(i)?.let { logNodeHierarchy(it, "$indent ") }
}
}
override fun onAccessibilityEvent(e: AccessibilityEvent) {
if (acceptAppUpdateEnabled && isAppUpdateDialog(e)) {
AppLog.info("isAppUpdateDialog? ${isAppUpdateDialog(e)}")
val okButton = appUpdateDialogOkButton(e)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val rootNode = e.source
rootNode?.let { logNodeHierarchy(it, "") }
}
if (okButton != null) {
okButton.performAction(AccessibilityNodeInfo.ACTION_CLICK)
onAppUpdateAccepted()
}
}}
private fun isAppUpdateDialog(e: AccessibilityEvent): Boolean =
e.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && (
e.packageName == "com.google.android.packageinstaller" ||
e.packageName == "com.android.packageinstaller"
) &&
e.source != null && (
e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/install_confirm_question_update")
.isNotEmpty() ||
e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/install_confirm_question")
.isNotEmpty()
)
Подробнее здесь: https://stackoverflow.com/questions/795 ... ler-dialog
Android 14 (Apilevel 34) не может найти кнопку «Обновление» в диалоговом окне PackageInstaller ⇐ Android
Форум для тех, кто программирует под Android
1741899833
Anonymous
Я обновляю свое приложение для Android для поддержки Android 14. Приложение можно обновить с помощью CMS (система управления контентом). Когда приложение не является владельцем устройства, пользователи могут включить опцию автоматического обновления. Включение этой опции требует, чтобы пользователь активировал службу доступности, предоставленную моим приложением. Эта служба предназначена для автоматического приема обновлений приложений путем обнаружения диалогового окна PackageInstaller, поиска кнопки «OK» (или «Обновление»), и программно нажав ее. /> Выполнение действия нажатия на кнопке с использованием vicalbibilityndeinfo.performaction (доступность nodeinfo.action_click). < /p>
Однако на Android 14 кнопка «OK» или «Обновление» больше не обнаруживается в иерархии узла доступности. Я зарегистрировал иерархию диалога, и кажется, что кнопка либо скрыта, либо не включена в Дерево доступности. Вот зарегистрированная иерархия: < /p>
null - android.widget.FrameLayout - null - null
com.android.packageinstaller:id/alertTitle - android.widget.TextView - iGotcha Signage Player - null
com.android.packageinstaller:id/install_confirm_question_update - android.widget.TextView - Do you want to update this app? - null
com.android.packageinstaller:id/buttonPanel - android.widget.ScrollView - null - null
com.android.packageinstaller:id/button2 - android.widget.Button - Cancel - null
< /code>
Как вы можете видеть, кнопка «ОК» или «Обновление» отсутствует, в то время как кнопка «Отмена» (кнопка2) присутствует. Это ошибка, или есть новые ограничения в Android 14, которые не позволяют службам доступности взаимодействовать с системными диалогами? Есть ли обходные пути для программного приема обновлений приложений в этом сценарии? < /P>
private fun appUpdateDialogOkButton(e: AccessibilityEvent): AccessibilityNodeInfo? =
e.source!!.findAccessibilityNodeInfosByViewId("android:id/button1").firstOrNull()
?: e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/ok_button").firstOrNull()
?: e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/button1").firstOrNull()
private fun logNodeHierarchy(node: AccessibilityNodeInfo, indent: String) {
AppLog.debug("$indent${node.viewIdResourceName} - ${node.className} - ${node.text} - ${node.contentDescription}")
for (i in 0 until node.childCount) {
node.getChild(i)?.let { logNodeHierarchy(it, "$indent ") }
}
}
override fun onAccessibilityEvent(e: AccessibilityEvent) {
if (acceptAppUpdateEnabled && isAppUpdateDialog(e)) {
AppLog.info("isAppUpdateDialog? ${isAppUpdateDialog(e)}")
val okButton = appUpdateDialogOkButton(e)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val rootNode = e.source
rootNode?.let { logNodeHierarchy(it, "") }
}
if (okButton != null) {
okButton.performAction(AccessibilityNodeInfo.ACTION_CLICK)
onAppUpdateAccepted()
}
}}
private fun isAppUpdateDialog(e: AccessibilityEvent): Boolean =
e.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && (
e.packageName == "com.google.android.packageinstaller" ||
e.packageName == "com.android.packageinstaller"
) &&
e.source != null && (
e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/install_confirm_question_update")
.isNotEmpty() ||
e.source!!.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/install_confirm_question")
.isNotEmpty()
)
Подробнее здесь: [url]https://stackoverflow.com/questions/79507629/android-14-apilevel-34-cannot-find-update-button-in-packageinstaller-dialog[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия