Dans Lollipop (API 22), chaque fois que dans mon application, je montre une vue Web, l'application se bloque. J'ai plusieurs plantages dans ma console de développement Android liés à cet événement.
Inutile de dire que cela fonctionne sur Android 4, 6 et 7.
Lire la trace de la pile (postée à la fin de cet article), quelque chose me dérange
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
J'ai cherché dans le R.java généré sans aucune chance, évidemment parce que l'ID n'existe pas, mais cela valait la peine d'essayer.
La recherche sur Google autour du problème semble être liée à la façon dont sucette gère la vue Web. J'ai commencé un nouvel AVD avec sucette basé sur un appareil que j'ai trouvé sur le journaliste de crash dans GDC, et je peux reproduire le problème.
Trace complète de la pile:
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
problème système . Je ne sais pas si / quand les émulateurs obtiennent des mises à jour à ce sujet. Avez-vous essayé du matériel?Réponses:
Si vous utilisez
androidx.appcompat:appcompat:1.1.0
, essayez à laandroidx.appcompat:appcompat:1.0.2
place. il semble que1.1.0
cela ne corrige pas le bogue avecWebView
Android5.1.1
.Mise à jour de février-2020: le retour à l'
1.0.2
arrêt de travail pour de nombreuses personnes (y compris mon application), mais l'utilisation de la version actuelle deandroidx.appcompat:appcompat:1.2.0-alpha02
a corrigé le plantage. (Je le voyais sur un Huawei P8 Lite exécutant Android 5.0 lors des tests automatisés de "rapport de pré-lancement" de Google).Mise à jour de juin-2020: il existe des versions plus récentes que celle mentionnée dans la mise à jour de février-2020, vous pouvez voir les versions actuellement disponibles ici:
la source
androidx.appcompat:appcompat:1.2.0-alpha03
fonctionne aussiAvertissement: cette solution de contournement peut également casser certaines choses; voir les commentaires pour plus de détails
Si vous souhaitez gonfler la WebView à partir d'une mise en page XML, vous pouvez l'envelopper dans une jolie petite sous-classe (basée sur la réponse d'ikostet ):
EDIT: encore plus sympa avec Kotlin
la source
Si vous utilisez
androidx.appcompat:appcompat:1.1.0
et que vous ne souhaitez pas rétrograderandroidx.appcompat:appcompat:1.0.2
ou effectuer une mise à niveau versandroidx.appcompat:appcompat:1.2.0-alpha03
, il existe une autre solution qui est décrite dans ce commentaire sur Google Issue Tracker.Sur la base de ce commentaire, vous pouvez remplacer le
getAssets()
dans l'activité de WebView afin qu'il revienne à lagetResources().getAssets()
place pour résoudre le problème.Java
Kotlin
la source
applyOverrideConfiguration
appels dans la bibliothèque AppCompat.mon conseil est de n'utiliser custom / new
Configuration
que lorsque "original one" pose des problèmes, donc sur Lollipop uniquement. Le code @SpaceBizon fonctionne bien jusqu'à Android 8.x, sur 9 et Q (actuellement bêta), chaque pression de sélection / liste déroulante n'affichera pas leAlertDialog
sélecteur, au lieu de cette fuite de mémoire se produit ... ci-dessous lagetFixedContext
méthode fixe avec le code de version approprié "iffed"la source
Si vous utilisez androidx.appcompat: appcompat: 1.1.0, passez à androidx.appcompat: appcompat: 1.0.2 ou si vous souhaitez utiliser le thème DayNight, remplacez applyOverrideConfiguration dans votre activité comme suit. (Remarque: cela nécessite le redémarrage de l'application lors du passage du thème sombre au thème clair et vice versa).
la source
21..22
, au lieu de21..25
? Le problème ne semble pas se produire dans l'API 23+.@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Si vous ne comptez pas sur le changement de thème DayNight (ou d'autres événements UiMode), vous pouvez ajouter android: configChanges = "uiMode" au manifeste d'activité de la vue Web pour empêcher AppCompatDelegate de mettre à jour la configuration des ressources et de gâcher ainsi l'inflation de la vue Web.
la source
Essayez d'utiliser pour créer une vue Web:
la source
Et un autre essaie de résoudre le problème. Devrait remplacer cette méthode dans votre activité:
la source
J'ai pu reproduire le crash sur l'API 21 dans l'émulateur.
J'ai donc essayé d'ajouter ceci à l'implémentation, comme décrit dans la documentation :
L'ajout
appcompat-resources
n'a pas résolu le problème.Peut-être qu'une version future le sera, mais je tenais à mentionner qu'il semble y avoir une bibliothèque de ressources complémentaires qui est censée résoudre ce problème. Donc, lorsque vous essayez de résoudre ce problème avec une nouvelle version de
appcompat
, ajoutez leappcompat-resources
bibliothèque avec la même version.Revenir à
androidx.appcompat:appcompat:1.0.2
a résolu le problème comme solution de contournement.la source
"androidx.appcompat:appcompat-resources:$appcompat_version"
à la version 1.0.2. "ERREUR: échec de la résolution: androidx.appcompat: appcompat-resources: 1.0.2"Le code ci-dessous résoudra le problème. Veuillez l'ajouter dans votre
Activity
:la source
Pour rappel, j'ai lutté pendant un certain temps même si je suis passé à la version 1.0.2, simplement parce que je semblait avoir une dépendance transitive à appcompat: 1.1.0 via androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Une fois que j'ai rétrogradé cela à constraintlayout: 1.1.3 tout fonctionnait bien
(Selon https://issuetracker.google.com/issues/141351441, le problème sera bientôt résolu avec appcompat: 1.2.0-alpha02)
la source
J'ai utilisé la dernière version de cette source . Veuillez vérifier et utiliser le vôtre en fonction de ce que vous pensez être le mieux.
Au cas où vous voudriez sauter, la mise en œuvre ci-dessous résout le problème:
la source
戴 文锦 me convenait aussi. Mais la rétrogradation de androidx.appcompat: appcompat: 1.1.0 vers 1.0.2 n'a pas réussi.
J'ai rétrogradé toutes mes versions d'androidx précédemment mises à niveau de
retour à
Un rappel que le code de Googles n'est de loin pas exempt de bogues et bien testé et que quelqu'un ne devrait jamais mettre à niveau les versions à la légère.
la source
androidx.appcompat:appcompat
fonctionné pour moi. Aux futurs lecteurs: assurez-vous de "graduer la synchronisation" et confirmez que ce n'est pas suffisant pour vous, avant de rétrograder plus de choses.la source
AppCompat 1.2.0-alpha02 est sorti aujourd'hui, vous pouvez donc utiliser
qui résoudra les problèmes de WebView sur Lollipop.
la source
J'ai pu reproduire ce problème sur une API Nexus 7 22. Le problème est résolu en mettant à jour la version de la tablette d'Android System WebView de la version 39 (2237560-arm) à la version 79.0.3945.136
Ce n'est pas sous mon contrôle pour un utilisateur de faire cela, mais c'est une solution si vous avez besoin d'aider quelqu'un à utiliser votre application immédiatement.
la source
Le problème a été résolu pour mon en rétrogradant à l'implémentation 'androidx.appcompat: appcompat: 1.0.2'
la source
Dans mon cas, un problème était dans la méthode
d'une MainActivity. Je ne sais pas pourquoi cela affecte
WebView
.getUserId()
n'est ni surchargée, ni méthode publique de laActivity
classe. Si je renomme ou supprime cette méthode,WebView
commence à s'ouvrir. Essayer aussi de changerà
conduit à la même exception. Je compris que quand avait vu une exception:
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
. Dans ce cas, user = 123456 était en fait mon utilisateur autorisé, qui a été utilisé dans certaines requêtes, pas dansWebView
. Je soupçonne qu'Android utiliseuserId
comme user_id local pour ses processus.Comme beaucoup d'autres personnes l'ont remarqué, nous pourrions utiliser
appcompat:1.1.0
ou1.0.2
et étendre laWebView
classe. Dans l'émulateur 21 sans services Google Play, celaWebView
plantera en cas de contact prolongé sur les étiquettes de texte, mais sur les appareils typiques, tout va bien.la source
Au lieu de changer de version d'une dépendance, j'ai implémenté la génération par programme de webView en tant que solution.
Le problème ressemble en fait à commencer par la lecture de la mise en page à partir d'un fichier xml. Donc, si la méthode programmatique est une solution applicable pour vous, veuillez vérifier l'exemple ci-dessous.
Que de simplement ajouter dans votre vue parentale:
la source
Vérifiez la version. L'application Androidx et la version matérielle de Google restent toujours les mêmes.
entrez la description de l'image ici
la source