W Lollipop (API 22) za każdym razem, gdy w mojej aplikacji wyświetlam webview, aplikacja ulega awarii. Mam wiele awarii w mojej konsoli programisty Androida związanych z tym zdarzeniem.
Nie trzeba mówić, że działa na Androidzie 4, 6 i 7.
Czytając ślad stosu (zamieszczony na końcu tego postu), coś mnie niepokoi
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
Szukałem w wygenerowanym R.java bez szczęścia, oczywiście bo ID nie istnieje, ale warto było spróbować.
Wyszukiwanie problemu w Google wydaje się być związane ze sposobem, w jaki Lollipop radzi sobie z wyświetlaniem w sieci Web. Uruchomiłem nowy AVD z Lollipop na podstawie urządzenia, które znalazłem w raporcie awarii w GDC i mogę odtworzyć problem.
Pełny ślad stosu:
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
problem z systemem . Nie wiem, czy / kiedy emulatory otrzymają aktualizacje. Czy próbowałeś na sprzęcie?Odpowiedzi:
Jeśli używasz
androidx.appcompat:appcompat:1.1.0
, spróbujandroidx.appcompat:appcompat:1.0.2
zamiast tego. wygląda na to, że1.1.0
nie naprawia błęduWebView
w systemie Android5.1.1
.Aktualizacja z lutego 2020 r .: Powrót do stanu, w którym
1.0.2
przestał działać dla wielu osób (w tym mojej aplikacji), ale użycie bieżącej wersjiandroidx.appcompat:appcompat:1.2.0-alpha02
rozwiązało awarię. (Widziałem to na Huawei P8 Lite z systemem Android 5.0 podczas automatycznego testowania Google „Raport przed uruchomieniem”).Aktualizacja z czerwca 2020 r .: Dostępne są nowsze wersje niż te wymienione w aktualizacji z lutego 2020 r. Obecnie dostępne wersje można zobaczyć tutaj:
źródło
androidx.appcompat:appcompat:1.2.0-alpha03
też działaOstrzeżenie: to obejście może również zepsuć pewne rzeczy; szczegóły w komentarzach
Jeśli chcesz nadmuchać WebView z układu XML, możesz zawinąć go w ładną małą podklasę (na podstawie odpowiedzi ikostet ):
EDYCJA: teraz jeszcze ładniej z Kotlinem
źródło
Jeśli używasz
androidx.appcompat:appcompat:1.1.0
i nie chcesz przejść na starszą wersjęandroidx.appcompat:appcompat:1.0.2
lub uaktualnić doandroidx.appcompat:appcompat:1.2.0-alpha03
, istnieje inne rozwiązanie, które jest opisane w tym komentarzu do Google Issue Tracker.Na podstawie tego komentarza możesz zastąpić działanie
getAssets()
w WebView, abygetResources().getAssets()
zamiast tego powróciło w celu rozwiązania problemu.Jawa
Kotlin
źródło
applyOverrideConfiguration
listę zmian, wydaje się, że niektóre wersje przeglądarki internetowej mają problemy z wywołaniami w bibliotece AppCompat.radzę używać niestandardowego / nowego
Configuration
tylko wtedy, gdy „oryginalny” powoduje problemy, więc tylko na Lollipopie. Kod @SpaceBizon działa dobrze do Androida 8.x, na 9 i Q (obecnie beta) każde naciśnięcieAlertDialog
selektora / listy rozwijanej nie pokaże selektora, zamiast tego pojawia się wyciek pamięci ... poniżej ustalonejgetFixedContext
metody z "iffed" poprawnym kodem wersjiźródło
Jeśli używasz androidx.appcompat: appcompat: 1.1.0, zmień na androidx.appcompat: appcompat: 1.0.2 lub jeśli chcesz używać motywu DayNight, nadpisz ApplyOverrideConfiguration w swojej aktywności w następujący sposób. (Uwaga: wymaga to ponownego uruchomienia aplikacji podczas przełączania z ciemnego motywu na jasny motyw i odwrotnie).
źródło
21..22
zamiast21..25
? Wydaje się, że problem nie występuje w API 23+.@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Jeśli nie korzystasz z przełączania motywu DayNight (lub innych zdarzeń UiMode), możesz dodać android: configChanges = "uiMode" do manifestu aktywności Webview, aby uniemożliwić AppCompatDelegate zaktualizowanie konfiguracji zasobów, a tym samym zepsucie inflacji widoku internetowego.
źródło
Spróbuj użyć do tworzenia widoku internetowego:
źródło
I jeszcze raz spróbuj rozwiązać problem. Powinien zastąpić tę metodę w swoim działaniu:
źródło
Udało mi się odtworzyć awarię na API 21 w emulatorze.
Próbowałem więc dodać to do implementacji, jak opisano w dokumentach :
Dodawanie
appcompat-resources
nie nie rozwiązać problem.Być może przyszła wersja będzie, ale chciałem wspomnieć, że wydaje się, że istnieje biblioteka uzupełniających zasobów, która ma rozwiązać ten problem. Dlatego próbując rozwiązać ten problem za pomocą nowej wersji programu
appcompat
, dodajappcompat-resources
bibliotekę w tej samej wersji.Przywrócenie wersji
androidx.appcompat:appcompat:1.0.2
rozwiązało problem jako obejście.źródło
"androidx.appcompat:appcompat-resources:$appcompat_version"
do wersji 1.0.2. „BŁĄD: nie udało się rozwiązać problemu: androidx.appcompat: appcompat-resources: 1.0.2”Poniższy kod rozwiąże problem. Dodaj go do
Activity
:źródło
Na marginesie, przez chwilę walczyłem, mimo że obniżyłem wersję 1.0.2, tylko dlatego, że wydawało mi się, że mam przechodnią zależność od appcompat: 1.1.0 przez androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Kiedyś obniżyłem to do constraintlayout: 1.1.3 wszystko działało dobrze
(Według https://issuetracker.google.com/issues/141351441 problem zostanie wkrótce rozwiązany dzięki appcompat: 1.2.0-alpha02)
źródło
Użyłem najnowszej wersji z tego źródła . Sprawdź i użyj własnego na podstawie tego, co uważasz za najlepsze.
Jeśli chcesz pominąć, poniższa implementacja rozwiązuje problem:
źródło
戴 文锦 też był dla mnie odpowiedni. Ale obniżenie wersji tylko androidx.appcompat: appcompat: 1.1.0 do 1.0.2 nie powiodło się.
Zmniejszyłem wszystkie moje poprzednio zaktualizowane wersje Androidax z
wrócić do
Przypomnienie, że kod Googles zdecydowanie nie jest wolny od błędów i dobrze przetestowany oraz że ktoś nigdy nie powinien lekceważyć aktualizacji.
źródło
androidx.appcompat:appcompat
mi się. Do przyszłych czytelników: pamiętaj o „gradacji synchronizacji” i potwierdź, że to dla Ciebie niewystarczające, zanim obniżysz wersję.źródło
AppCompat 1.2.0-alpha02 został wydany dzisiaj, więc możesz używać
który naprawi problemy z WebView w Lollipop.
źródło
Udało mi się odtworzyć ten problem na Nexus 7 API 22. Problem został rozwiązany poprzez aktualizację wersji Android System WebView tabletu z wersji 39 (2237560-arm) do wersji 79.0.3945.136
Nie mam nad tym kontroli, aby użytkownik mógł to zrobić, ale jest to rozwiązanie, jeśli chcesz natychmiast pomóc komuś w korzystaniu z Twojej aplikacji.
źródło
Problem został rozwiązany przez przejście na wersję „androidx.appcompat: appcompat: 1.0.2”
źródło
W moim przypadku problem tkwił w metodzie
MainActivity. Nie wiem, dlaczego to wpływa
WebView
.getUserId()
nie jest ani nadpisaną, ani publiczną metodąActivity
klasy. Jeśli zmienię nazwę lub usunę tę metodę,WebView
zaczyna się otwierać. Próbuję też się zmienićdo
prowadzi do tego samego wyjątku. I rozumieć, że gdy widział wyjątek:
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
. W tym przypadku user = 123456 był w rzeczywistości moim autoryzowanym użytkownikiem, który był używany w niektórych żądaniach, a nie wWebView
. Podejrzewam, że Android używauserId
jako lokalnego user_id dla swoich procesów.Jak wiele osób zauważyło, możemy użyć klasy
appcompat:1.1.0
lub1.0.2
i ją rozszerzyćWebView
. W emulatorze 21 bez usług Google PlayWebView
będzie się to zawieszać po długim dotknięciu etykiet tekstowych, ale na typowych urządzeniach wszystko jest w porządku.źródło
Zamiast zmieniać wersję dowolnej zależności, zaimplementowałem programowo generowanie webView jako rozwiązanie.
Problem wygląda tak, jakby zaczynał się od odczytu układu z pliku xml. Więc jeśli programistyczny sposób jest dla Ciebie odpowiednim rozwiązaniem, sprawdź poniższą próbkę.
Następnie dodaj do widoku rodzica:
źródło
Sprawdź wersję. Androidx appcompat i wersja materiału Google są zawsze takie same.
wprowadź opis obrazu tutaj
źródło