Я обновляю свое приложение для 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение