In Lollipop (API 22) zeige ich jedes Mal in meiner Anwendung eine Webansicht, wenn die Anwendung abstürzt. Ich habe mehrere Abstürze in meiner Android-Entwicklerkonsole im Zusammenhang mit diesem Ereignis.
Keine Notwendigkeit zu sagen, dass es auf Android 4, 6 und 7 funktioniert.
Beim Lesen des Stack-Trace (am Ende dieses Beitrags veröffentlicht) nervt mich etwas
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
Ich habe in der generierten R.java ohne Glück gesucht, offensichtlich, weil die ID nicht existiert, aber es war einen Versuch wert.
Das Googeln um das Problem scheint damit zu tun zu haben, wie Lollipop mit der Webansicht umgeht. Ich habe eine neue AVD mit Lollipop gestartet, die auf einem Gerät basiert, das ich auf dem Crash Reporter in GDC gefunden habe, und ich kann das Problem reproduzieren.
Full-Stack-Trace:
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
zu sein. Ich weiß nicht, ob / wann die Emulatoren Updates dazu bekommen. Haben Sie Hardware anprobiert?Antworten:
Wenn Sie verwenden
androidx.appcompat:appcompat:1.1.0
, versuchen Sie esandroidx.appcompat:appcompat:1.0.2
stattdessen. Es scheint, dass1.1.0
dies den FehlerWebView
in Android nicht behebt5.1.1
.Update vom Februar 2020: Die Wiederherstellung der
1.0.2
Funktion für viele Benutzer (einschließlich meiner App) wurde eingestellt, aber die Verwendung der aktuellen Version vonandroidx.appcompat:appcompat:1.2.0-alpha02
hat den Absturz behoben . (Ich habe es auf einem Huawei P8 Lite mit Android 5.0 während des automatisierten Tests "Pre-Launch Report" von Google gesehen.)Update für Juni 2020: Es sind neuere Versionen verfügbar als die im Update für Februar 2020 genannten. Die derzeit verfügbaren Versionen finden Sie hier:
quelle
androidx.appcompat:appcompat:1.2.0-alpha03
funktioniert auchWarnung: Diese Problemumgehung kann auch einige Probleme verursachen. Einzelheiten finden Sie in den Kommentaren
Wenn Sie das WebView aus einem XML-Layout aufblasen möchten, können Sie es in eine nette kleine Unterklasse einschließen (basierend auf der Antwort von ikostet ):
EDIT: jetzt noch schöner mit Kotlin
quelle
Wenn Sie ein
androidx.appcompat:appcompat:1.1.0
Downgrade durchführenandroidx.appcompat:appcompat:1.0.2
oder kein Upgrade durchführen möchtenandroidx.appcompat:appcompat:1.2.0-alpha03
, gibt es eine andere Lösung, die in diesem Kommentar im Google Issue Tracker beschrieben wird.Basierend auf diesem Kommentar können Sie
getAssets()
die Aktivität in WebView überschreiben, sodass siegetResources().getAssets()
stattdessen zurückgegeben wird, um das Problem zu beheben .Java
Kotlin
quelle
applyOverrideConfiguration
Aufrufen in der AppCompat-Bibliothek zu haben.Mein Rat ist, benutzerdefinierte / neue
Configuration
nur zu verwenden, wenn "Original" Probleme verursacht, also nur auf Lollipop. @ SpaceBizon-Code funktioniert gut bis Android 8.x, bei 9 und Q (aktuelle Beta) wird bei jedem Auswahl- / Dropdown-Druck keine Auswahl angezeigtAlertDialog
, stattdessen tritt ein Speicherverlust auf ... unterhalb der festgelegtengetFixedContext
Methode mit dem richtigen Versionscode "iffed"quelle
Wenn Sie androidx.appcompat: appcompat: 1.1.0 verwenden, wechseln Sie entweder zu androidx.appcompat: appcompat: 1.0.2, oder wenn Sie das DayNight-Design verwenden möchten, überschreiben Sie applyOverrideConfiguration in Ihrer Aktivität wie folgt. (Hinweis: Dies erfordert einen Neustart der App, wenn Sie von Dark Theme zu Light Theme und umgekehrt wechseln.)
quelle
21..22
stattdessen sein21..25
? Das Problem scheint in API 23+ nicht aufzutreten.@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Wenn Sie sich nicht auf das Umschalten des DayNight-Themas (oder andere UiMode-Ereignisse) verlassen, können Sie dem Webview-Aktivitätsmanifest android: configChanges = "uiMode" hinzufügen, um zu verhindern, dass AppCompatDelegate die Ressourcenkonfiguration aktualisiert und dadurch die Webview-Inflation durcheinander bringt.
quelle
Versuchen Sie, eine Webansicht zu erstellen:
quelle
Und noch ein Versuch, das Problem zu beheben. Sollte diese Methode in Ihrer Aktivität überschreiben:
quelle
Ich konnte den Absturz auf API 21 im Emulator reproduzieren.
Also habe ich versucht, dies zur Implementierung hinzuzufügen, wie in den Dokumenten beschrieben :
Hinzufügen
appcompat-resources
haben nicht das Problem zu beheben.Vielleicht wird es eine zukünftige Version geben, aber ich wollte erwähnen, dass es eine ergänzende Ressourcenbibliothek zu geben scheint, die dieses Problem beheben soll. Wenn Sie versuchen, dies mit einer neuen Version von zu beheben
appcompat
, fügen Sie dieappcompat-resources
Bibliothek mit derselben Version hinzu.Durch Zurücksetzen auf
androidx.appcompat:appcompat:1.0.2
wurde das Problem als Problemumgehung behoben.quelle
"androidx.appcompat:appcompat-resources:$appcompat_version"
Version 1.0.2 zurückgreifen . "FEHLER: Fehler beim Auflösen: androidx.appcompat: appcompat-resources: 1.0.2"Der folgende Code behebt das Problem. Bitte fügen Sie es in Ihre
Activity
:quelle
Nur als Randnotiz, ich hatte eine Weile Probleme, obwohl ich auf 1.0.2 heruntergestuft hatte, nur weil ich eine transitive Abhängigkeit von appcompat: 1.1.0 über androidx.constraintlayout: Constraintlayout: 2.0.0-beta3 zu haben schien. Nachdem ich das auf Constraintlayout herabgestuft hatte: 1.1.3 hat alles gut funktioniert
(Laut https://issuetracker.google.com/issues/141351441 wird das Problem bald mit appcompat behoben: 1.2.0-alpha02)
quelle
Ich habe die neueste Version aus dieser Quelle verwendet . Bitte überprüfen und verwenden Sie Ihre eigenen, basierend auf dem, was Sie für am besten halten.
Wenn Sie überspringen möchten, löst die folgende Implementierung das Problem:
quelle
戴 文锦 war auch für mich richtig. Ein Downgrade von nur androidx.appcompat: appcompat: 1.1.0 auf 1.0.2 war jedoch nicht erfolgreich.
Ich habe alle meine zuvor aktualisierten AndroidX-Versionen von heruntergestuft
zurück zu
Eine Erinnerung daran, dass Googles-Code bei weitem nicht fehlerfrei und gut getestet ist und dass jemand die Versionen niemals flippig aktualisieren sollte.
quelle
androidx.appcompat:appcompat
hat bei mir funktioniert. Für zukünftige Leser: Stellen Sie sicher, dass Sie die Synchronisierung "gradle" durchführen und bestätigen, dass dies für Sie nicht ausreicht, bevor Sie weitere Inhalte herunterstufen.quelle
AppCompat 1.2.0-alpha02 wurde heute veröffentlicht, sodass Sie es verwenden können
Dadurch werden WebView-Probleme auf Lollipop behoben.
quelle
Ich konnte dieses Problem auf einer Nexus 7-API 22 reproduzieren. Das Problem wurde behoben, indem die Tablet-Version von Android System WebView von Version 39 (2237560-arm) auf Version 79.0.3945.136 aktualisiert wurde
Dies liegt nicht in meiner Kontrolle, damit ein Benutzer dies tun kann, aber es ist eine Lösung, wenn Sie jemandem helfen müssen, Ihre App sofort zu verwenden.
quelle
Das Problem wurde für mich durch ein Downgrade auf die Implementierung 'androidx.appcompat: appcompat: 1.0.2' behoben.
quelle
In meinem Fall war ein Problem in der Methode
einer Hauptaktivität. Ich weiß nicht, warum es beeinflusst
WebView
.getUserId()
ist weder überschrieben noch öffentliche Methode derActivity
Klasse. Wenn ich diese Methode umbenenne oder entferne, wirdWebView
sie geöffnet. Ich versuche auch zu ändernzu
führt zu der gleichen Ausnahme. Ich habe das verstanden, als ich eine Ausnahme gesehen hatte :
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
. In diesem Fall war user = 123456 tatsächlich mein autorisierter Benutzer, der in einigen Anfragen verwendet wurde, nicht inWebView
. Ich vermute, Android verwendetuserId
als lokale Benutzer-ID für seine Prozesse.Wie viele andere Leute bemerkten, konnten wir den Unterricht nutzen
appcompat:1.1.0
oder1.0.2
erweiternWebView
. In Emulator 21 ohne Google Play ServicesWebView
stürzt dies bei langen Berührungen über Textbeschriftungen ab, aber auf typischen Geräten ist alles in Ordnung.quelle
Anstatt die Version einer Abhängigkeit zu ändern, habe ich die programmgesteuerte Generierung von webView als Lösung implementiert.
Das Problem sieht tatsächlich so aus, als würde man mit dem Lesen des Layouts aus einer XML-Datei beginnen. Wenn also eine programmatische Lösung für Sie geeignet ist, überprüfen Sie bitte das folgende Beispiel.
Dann fügen Sie einfach Ihrer übergeordneten Ansicht hinzu:
quelle
Version prüfen. Androidx Appcompat und Google Materialversion bleiben immer gleich.
Geben Sie hier die Bildbeschreibung ein
quelle