En Lollipop (API 22) cada vez que en mi aplicación muestro una vista web, la aplicación se bloquea. Tengo varios bloqueos en mi consola de desarrollador de Android relacionados con este evento.
No hace falta decir que funciona en Android 4, 6 y 7.
Al leer el seguimiento de la pila (publicado al final de esta publicación), algo me molesta
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
Busqué en el R.java generado sin suerte, obviamente porque el ID no existe, pero valió la pena intentarlo.
Buscar en Google el problema parece estar relacionado con la forma en que Lollipop maneja la vista web. Comencé un AVD nuevo con piruleta basado en un dispositivo que encontré en el reportero de fallas en GDC, y puedo reproducir el problema.
Seguimiento de pila completa:
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
problema del sistema . No sé si / cuando los emuladores reciben actualizaciones de eso. ¿Has probado hardware?Respuestas:
Si usa
androidx.appcompat:appcompat:1.1.0
, intente en suandroidx.appcompat:appcompat:1.0.2
lugar. parece que1.1.0
no soluciona el errorWebView
en Android5.1.1
.Actualización de febrero de 2020: volviendo a
1.0.2
dejar de funcionar para muchas personas (incluida mi aplicación), pero el uso de la versión actual deandroidx.appcompat:appcompat:1.2.0-alpha02
solucionó el bloqueo. (Lo estaba viendo en un Huawei P8 Lite con Android 5.0 durante la prueba automatizada del "Informe previo al lanzamiento" de Google).Actualización de junio de 2020: hay versiones más nuevas disponibles que la mencionada en la actualización de febrero de 2020, puede ver las versiones disponibles actualmente aquí:
fuente
androidx.appcompat:appcompat:1.2.0-alpha03
también funcionaAdvertencia: esta solución alternativa también podría romper algunas cosas; ver los comentarios para más detalles
Si desea inflar WebView desde un diseño XML, puede envolverlo en una pequeña subclase agradable (según la respuesta de ikostet ):
EDITAR: ahora aún mejor con Kotlin
fuente
Si está utilizando
androidx.appcompat:appcompat:1.1.0
y no desea cambiarandroidx.appcompat:appcompat:1.0.2
o actualizar aandroidx.appcompat:appcompat:1.2.0-alpha03
, hay otra solución que se describe en este comentario en Google Issue Tracker.Según ese comentario, puede anular el
getAssets()
en la Actividad de WebView para que vuelvagetResources().getAssets()
a resolver el problema.Java
Kotlin
fuente
applyOverrideConfiguration
llamadas dentro de la biblioteca AppCompat.Mi consejo es usar custom / new
Configuration
solo cuando el "original" esté causando problemas, por lo tanto, solo en Lollipop. El código de @SpaceBizon funciona bien hasta Android 8.x, en 9 y Q (actualmente beta) cada pulsación de selección / menú desplegable no mostrará elAlertDialog
selector, en lugar de que se produzca una fuga de memoria ...getFixedContext
método fijo a continuación con el código de versión adecuado "iffed"fuente
Si está utilizando androidx.appcompat: appcompat: 1.1.0, cambie a androidx.appcompat: appcompat: 1.0.2 o si desea usar el tema DayNight, anule applyOverrideConfiguration en su actividad de la siguiente manera. (Nota: Esto requiere reiniciar la aplicación mientras se cambia de Tema oscuro a Tema claro y viceversa).
fuente
21..22
, en lugar de21..25
? El problema no parece ocurrir en API 23+.@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Si no confía en el cambio de tema de DayNight (u otros eventos de UiMode), puede agregar android: configChanges = "uiMode" al manifiesto de actividad de webview para evitar que AppCompatDelegate actualice la configuración de recursos y, por lo tanto, estropee la inflación de webview.
fuente
Intente usarlo para crear vistas web:
fuente
Y un intento más de solucionar el problema. Debería anular este método en su actividad:
fuente
Pude reproducir el bloqueo en API 21 en el emulador.
Así que intenté agregar esto a la implementación, como se describe en los documentos :
Añadiendo
appcompat-resources
hizo no solucionar el problema.Tal vez lo haga una versión futura, pero quería mencionar que parece haber una biblioteca de recursos complementaria que se supone que abordará este problema. Entonces, cuando intente solucionar este problema con una nueva versión de
appcompat
, agregue laappcompat-resources
biblioteca con la misma versión.Revertir a
androidx.appcompat:appcompat:1.0.2
solucionó el problema como solución.fuente
"androidx.appcompat:appcompat-resources:$appcompat_version"
a la versión 1.0.2. "ERROR: No se pudo resolver: androidx.appcompat: appcompat-resources: 1.0.2"El siguiente código solucionará el problema. Por favor agréguelo en su
Activity
:fuente
Solo como nota al margen, luché por un tiempo a pesar de que bajé a 1.0.2, solo porque parecía tener una dependencia transitiva a appcompat: 1.1.0 a través de androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Una vez que lo rebajé a diseño de restricción: 1.1.3 todo funcionó bien
(Según https://issuetracker.google.com/issues/141351441, el problema se solucionará pronto con appcompat: 1.2.0-alpha02)
fuente
Usé la última versión de esta fuente . Verifique y use el suyo según lo que crea que es mejor.
En caso de que desee omitir, la siguiente implementación resuelve el problema:
fuente
戴 文锦 también era adecuado para mí. Pero la degradación de solo androidx.appcompat: appcompat: 1.1.0 a 1.0.2 no tuvo éxito.
Bajé todas mis versiones de androidx previamente actualizadas de
de regreso
Un recordatorio de que el código de Google no está libre de errores ni está bien probado y que nadie debería actualizar las versiones con ligereza.
fuente
androidx.appcompat:appcompat
funcionó para mí. Para futuros lectores: asegúrese de "sincronizar gradle" y confirme que no es suficiente para usted, antes de degradar más cosas.fuente
AppCompat 1.2.0-alpha02 se lanzó hoy, por lo que puede usar
que solucionará los problemas de WebView en Lollipop.
fuente
Pude reproducir este problema en una API 22 de Nexus 7. El problema se soluciona actualizando la versión de la tableta de Android System WebView de la versión 39 (2237560-arm) a la versión 79.0.3945.136
Esto no está bajo mi control para que un usuario haga esto, pero es una solución si necesita ayudar a alguien a usar su aplicación de inmediato.
fuente
El problema se resolvió para mi degradando a la implementación 'androidx.appcompat: appcompat: 1.0.2'
fuente
En mi caso, un problema estaba en el método.
de una actividad principal. No sé por qué afecta
WebView
.getUserId()
no es anulado ni método público de laActivity
clase. Si cambio el nombre o elimino este método,WebView
comienza a abrirse. También tratando de cambiara
conduce a la misma excepción. Entendí que cuando había visto una excepción:
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
. En ese caso, user = 123456 era de hecho mi usuario autorizado, que se usó en algunas solicitudes, no enWebView
. Sospecho que Android usauserId
como user_id local para sus procesos.Como muchas otras personas notaron, podríamos usar
appcompat:1.1.0
o1.0.2
y extender laWebView
clase. En el emulador 21 sin los servicios de Google Play, estoWebView
se bloqueará al tocar durante mucho tiempo las etiquetas de texto, pero en los dispositivos típicos todo está bien.fuente
En lugar de cambiar la versión de cualquier dependencia, implementé la generación de webView mediante programación como solución.
En realidad, el problema parece comenzar con el diseño de lectura del archivo xml. Entonces, si la forma programática es una solución aplicable para usted, consulte la siguiente muestra.
Que solo agregar a su vista de padres:
fuente
Consultar versión. El appcompat de Androidx y la versión de material de Google se mantienen siempre iguales.
ingrese la descripción de la imagen aquí
fuente