В Lollipop (API 22) каждый раз, когда в моем приложении я показываю веб-просмотр, приложение вылетает. У меня несколько сбоев в консоли разработчика Android, связанных с этим событием.
Не нужно говорить, что он работает на Android 4, 6 и 7.
Читая трассировку стека (размещенную в конце этого поста), что-то меня беспокоит
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
Я безуспешно искал в сгенерированном R.java, очевидно, потому что ID не существует, но попробовать стоило.
Поиск в Google проблемы, похоже, связан с тем, как Lollipop обрабатывает веб-просмотр. Я начал новый AVD с леденцом на палочке, основанный на устройстве, которое я нашел в репортере сбоев в GDC, и я могу воспроизвести проблему.
Полная трассировка стека:
android.view.InflateException: Binary XML file line #7: Error inflating class android.webkit.WebView
at android.view.LayoutInflater.createView(LayoutInflater.java:633)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
at android.content.res.Resources.getText(Resources.java:299)
at android.content.res.Resources.getString(Resources.java:385)
at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:684)
at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:608)
at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:631)
at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:780)
at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:619)
at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:556)
at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:311)
at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:96)
at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:263)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:123)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:110)
at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:107)
at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:260)
at android.webkit.WebView.<init>(WebView.java:554)
at android.webkit.WebView.<init>(WebView.java:489)
at android.webkit.WebView.<init>(WebView.java:472)
at android.webkit.WebView.<init>(WebView.java:459)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at it.artecoop.ibreviary.WebViewFragment.onCreateView(WebViewFragment.java:67)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
WebView
проблему. Я не знаю, получат ли / когда эмуляторы обновления этого. На железе пробовали?Ответы:
Если вы используете
androidx.appcompat:appcompat:1.1.0
, попробуйтеandroidx.appcompat:appcompat:1.0.2
вместо этого. похоже,1.1.0
это не исправляет ошибкуWebView
в Android5.1.1
.Обновление за февраль 2020 г .: Возврат в режим
1.0.2
перестал работать для многих людей (включая мое приложение), но использование текущей версииandroidx.appcompat:appcompat:1.2.0-alpha02
действительно устранило сбой. (Я видел это на Huawei P8 Lite под управлением Android 5.0 во время автоматизированного тестирования Google «Отчет перед запуском»).Обновление июнь-2020: доступны более новые выпуски, чем тот, который упомянут в обновлении за февраль-2020, вы можете увидеть доступные в настоящее время версии здесь:
источник
androidx.appcompat:appcompat:1.2.0-alpha03
тоже работаетПредупреждение: этот обходной путь также может сломать некоторые вещи; подробности см. в комментариях
Если вы хотите раздуть WebView из XML-макета, вы можете обернуть его в небольшой приятный подкласс (на основе ответа ikostet ):
РЕДАКТИРОВАТЬ: теперь еще лучше с Kotlin
источник
Если вы используете
androidx.appcompat:appcompat:1.1.0
и не хотите переходить на более раннюю версиюandroidx.appcompat:appcompat:1.0.2
или обновляться доandroidx.appcompat:appcompat:1.2.0-alpha03
нее, есть еще одно решение, описанное в этом комментарии в Google Issue Tracker.На основе этого комментария вы можете переопределить
getAssets()
в Activity WebView, чтобы он возвращалсяgetResources().getAssets()
вместо этого для решения проблемы.Ява
Котлин
источник
applyOverrideConfiguration
вызовами внутри библиотеки AppCompat.Мой совет - использовать custom / new
Configuration
только тогда, когда "оригинальный" вызывает проблемы, то есть только на Lollipop. Код @SpaceBizon хорошо работает до Android 8.x, на 9 и Q (текущая бета) каждое нажатие кнопки выбора / раскрывающегося списка не будет отображатьAlertDialog
средство выбора, вместо этого происходит утечка памяти ... ниже фиксированныйgetFixedContext
метод с правильным кодом версии "iffed"источник
Если вы используете androidx.appcompat: appcompat: 1.1.0, либо измените на androidx.appcompat: appcompat: 1.0.2, либо если вы хотите использовать тему DayNight, переопределите applyOverrideConfiguration в своей деятельности следующим образом. (Примечание: для этого требуется перезапуск приложения при переключении с темной темы на светлую и наоборот).
источник
21..22
вместо21..25
? Проблема не возникает в API 23+.@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Если вы не полагаетесь на переключение тем DayNight (или другие события UiMode), вы можете добавить android: configChanges = "uiMode" в манифест активности веб-просмотра, чтобы предотвратить обновление AppCompatDelegate конфигурации ресурсов и тем самым испортить инфляцию веб-просмотра.
источник
Попробуйте использовать для создания веб-просмотра:
источник
И еще одна попытка решить проблему. Следует переопределить этот метод в вашей деятельности:
источник
Мне удалось воспроизвести сбой API 21 в эмуляторе.
Поэтому я попытался добавить это к реализации, как описано в документации :
Добавление
appcompat-resources
ничего не решить проблему.Возможно, появится в будущей версии, но я хотел упомянуть, что, похоже, существует дополнительная библиотека ресурсов, которая должна решить эту проблему. Поэтому, пытаясь исправить это с помощью новой версии
appcompat
, добавьтеappcompat-resources
библиотеку с той же версией.Возврат к
androidx.appcompat:appcompat:1.0.2
устранению проблемы в качестве временного решения.источник
"androidx.appcompat:appcompat-resources:$appcompat_version"
к версии 1.0.2. «ОШИБКА: не удалось устранить: androidx.appcompat: appcompat-resources: 1.0.2»Приведенный ниже код устранит проблему. Пожалуйста, добавьте его в свой
Activity
:источник
В качестве побочного примечания, я какое-то время боролся, хотя я снизился до 1.0.2, просто потому, что у меня, казалось, была транзитивная зависимость от appcompat: 1.1.0 через androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Как только я понизил это до constraintlayout: 1.1.3, все работало нормально
(Согласно https://issuetracker.google.com/issues/141351441 проблема скоро будет исправлена с appcompat: 1.2.0-alpha02)
источник
Я использовал последнюю версию из этого источника . Пожалуйста, проверьте и используйте свои собственные, исходя из того, что вы считаете лучшим.
Если вы хотите пропустить, приведенная ниже реализация решает проблему:
источник
戴 文锦 мне тоже подошел. Но понижение только androidx.appcompat: appcompat: с 1.1.0 до 1.0.2 не удалось.
Я понизил все мои ранее обновленные версии androidx с
вернуться к
Напоминание о том, что код Googles далеко не свободен от ошибок и хорошо протестирован, и что кто-то никогда не должен легкомысленно обновлять версии.
источник
androidx.appcompat:appcompat
меня просто понижение версии сработало. Будущим читателям: убедитесь, что вы выбрали "синхронизацию градиента" и подтвердили, что этого недостаточно для вас, прежде чем переходить на более раннюю версию.источник
AppCompat 1.2.0-alpha02 был выпущен сегодня, поэтому вы можете использовать
который исправит проблемы WebView на Lollipop.
источник
Мне удалось воспроизвести эту проблему на Nexus 7 API 22. Проблема устранена путем обновления версии Android System WebView для планшета с версии 39 (2237560-arm) до версии 79.0.3945.136.
Я не могу этого сделать для пользователя, но это решение, если вам нужно помочь кому-то немедленно использовать ваше приложение.
источник
Проблема была решена для меня путем перехода на реализацию androidx.appcompat: appcompat: 1.0.2.
источник
В моем случае проблема была в методе
объекта MainActivity. Не знаю, почему это влияет
WebView
.getUserId()
не является ни переопределенным, ни публичным методомActivity
класса. Если я переименую или удалю этот метод,WebView
начинает открываться. Также пытаюсь изменитьк
приводит к тому же исключению. Я понял , что , когда он видел исключение:
Caused by: java.lang.SecurityException: Permission Denial: null asks to run as user 123456 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL or android.permission.INTERACT_ACROSS_USERS
. В этом случае user = 123456 фактически был моим авторизованным пользователем, который использовался в некоторых запросах, а не вWebView
. Я подозреваю, что Android используетuserId
в качестве локального user_id для своих процессов.Как заметили многие другие люди, мы можем использовать
appcompat:1.1.0
или1.0.2
расширятьWebView
класс. В эмуляторе 21 без сервисов Google Play этоWebView
приведет к сбою при долгом нажатии на текстовые метки, но на типичных устройствах все в порядке.источник
Вместо того, чтобы менять версию какой-либо зависимости, я реализовал программную генерацию webView в качестве решения.
Проблема на самом деле выглядит как начало чтения макета из файла xml. Поэтому, если программный способ подходит для вас, пожалуйста, проверьте приведенный ниже образец.
Чем просто добавьте в родительский вид:
источник
Проверить версию. Совместимость приложений Androidx и версия материалов Google всегда одинаковы.
введите описание изображения здесь
источник