No Lollipop (API 22), sempre que em meu aplicativo eu mostro um webview, o aplicativo trava. Eu tenho várias falhas no meu console de desenvolvedor Android relacionadas a este evento.
Não é preciso dizer que funciona no Android 4, 6 e 7.
Lendo o stack trace (postado no final deste post), algo me incomoda
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2040003
Procurei no R.java gerado sem sorte, obviamente porque o ID não existe, mas valeu a pena tentar.
Pesquisar o problema no Google parece estar relacionado a como o lollipop lida com a visualização da web. Comecei um novo AVD com pirulito baseado em um dispositivo que encontrei no relator de acidente no GDC, e posso reproduzir o problema.
Rastreamento de pilha completo:
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 de sistema . Não sei se / quando os emuladores receberão atualizações para isso. Você já experimentou no hardware?Respostas:
Se você usar
androidx.appcompat:appcompat:1.1.0
, tente emandroidx.appcompat:appcompat:1.0.2
vez disso. parece que1.1.0
não corrige o bugWebView
no Android5.1.1
.Atualização de fevereiro de 2020: Reverter para
1.0.2
parar de funcionar para muitas pessoas (incluindo meu aplicativo), mas usar a versão atual doandroidx.appcompat:appcompat:1.2.0-alpha02
corrigiu a falha. (Eu estava vendo isso em um Huawei P8 Lite rodando Android 5.0 durante o teste automatizado de "Relatório de pré-lançamento" do Google).Atualização de junho de 2020: há versões mais recentes disponíveis do que a mencionada na atualização de fevereiro de 2020. Você pode ver as versões disponíveis atualmente aqui:
fonte
androidx.appcompat:appcompat:1.2.0-alpha03
também funcionaAviso: esta solução alternativa também pode interromper algumas coisas; veja os comentários para detalhes
Se quiser aumentar o WebView a partir de um layout XML, você pode envolvê-lo em uma pequena subclasse (com base na resposta de ikostet ):
EDITAR: agora ainda melhor com Kotlin
fonte
Se você estiver usando
androidx.appcompat:appcompat:1.1.0
e não quiser fazer downgradeandroidx.appcompat:appcompat:1.0.2
ou upgrade paraandroidx.appcompat:appcompat:1.2.0-alpha03
, há outra solução que é descrita neste comentário no Rastreador de problemas do Google.Com base nesse comentário, você pode substituir o
getAssets()
na Atividade do WebView para que ele retornegetResources().getAssets()
para resolver o problema.Java
Kotlin
fonte
applyOverrideConfiguration
chamadas dentro da biblioteca AppCompat.meu conselho é usar custom / new
Configuration
apenas quando o "original" estiver causando problemas, portanto, apenas no Lollipop. O código @SpaceBizon funciona bem até o Android 8.x, no 9 e Q (atualmente beta), cada seleção / seleção suspensa não mostra oAlertDialog
seletor, em vez de ocorrer vazamento de memória ... corrigido abaixogetFixedContext
método com o código de versão adequado "iffed"fonte
Se você estiver usando androidx.appcompat: appcompat: 1.1.0, mude para androidx.appcompat: appcompat: 1.0.2 ou se quiser usar o tema DayNight, substitua applyOverrideConfiguration em sua atividade da seguinte maneira. (Observação: isso requer a reinicialização do aplicativo ao alternar do tema escuro para o tema claro e vice-versa).
fonte
21..22
, em vez de21..25
? O problema não parece ocorrer na API 23+.@Override public void applyOverrideConfiguration(Configuration overrideConfiguration) { if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) { return; } super.applyOverrideConfiguration(overrideConfiguration); }
Se você não está dependendo da troca de tema DayNight (ou outros eventos UiMode), pode adicionar android: configChanges = "uiMode" ao manifesto de atividade do webview para evitar que AppCompatDelegate atualize a configuração de Recursos e, assim, atrapalhe a inflação do webview.
fonte
Tente usar para criar webview:
fonte
E mais uma tentativa de resolver o problema. Deve substituir este método em sua atividade:
fonte
Consegui reproduzir a falha na API 21 no emulador.
Tentei adicionar isso à implementação, conforme descrito nos documentos :
Acrescentando
appcompat-resources
que não corrigir o problema.Talvez uma versão futura funcione, mas eu gostaria de mencionar que parece haver uma biblioteca de recursos complementares que supostamente resolverá esse problema. Então, ao tentar corrigir isso com uma nova versão do
appcompat
, adicione oappcompat-resources
biblioteca com a mesma versão.Reverter para
androidx.appcompat:appcompat:1.0.2
corrigiu o problema como uma solução alternativa.fonte
"androidx.appcompat:appcompat-resources:$appcompat_version"
para a versão 1.0.2. "ERROR: Failed to resolve: androidx.appcompat: appcompat-resources: 1.0.2"O código a seguir resolverá o problema. Adicione-o ao seu
Activity
:fonte
Apenas como uma observação lateral, eu lutei por um tempo mesmo tendo feito o downgrade para 1.0.2, apenas porque parecia ter uma dependência transitiva para appcompat: 1.1.0 via androidx.constraintlayout: constraintlayout: 2.0.0-beta3. Depois de rebaixar para layout de restrição: 1.1.3 tudo funcionou bem
(De acordo com https://issuetracker.google.com/issues/141351441, o problema será corrigido em breve com appcompat: 1.2.0-alpha02)
fonte
Usei a versão mais recente desta fonte . Verifique e use o seu próprio com base no que você acha que é o melhor.
Caso você queira pular, a implementação abaixo resolve o problema:
fonte
戴 文锦 era certo para mim também. Mas o downgrade apenas de androidx.appcompat: appcompat: 1.1.0 para 1.0.2 não teve êxito.
Eu fiz downgrade de todas as minhas versões do androidx atualizadas anteriormente de
de volta a
Um lembrete de que o código do Google de longe não está livre de bugs e é bem testado e que ninguém deve atualizar as versões levianamente.
fonte
androidx.appcompat:appcompat
funcionou para mim. Para futuros leitores: certifique-se de "sincronização gradle" e confirme se não é suficiente para você, antes de fazer downgrade de mais coisas.fonte
AppCompat 1.2.0-alpha02 foi lançado hoje, então você pode usar
que corrigirá os problemas do WebView no Lollipop.
fonte
Consegui reproduzir esse problema em um Nexus 7 API 22. O problema foi corrigido com a atualização da versão do tablet do Android System WebView da versão 39 (2237560-arm) para a versão 79.0.3945.136
Não estou sob meu controle para um usuário fazer isso, mas é uma solução se você precisar ajudar alguém a usar seu aplicativo imediatamente.
fonte
O problema foi resolvido para mim fazendo o downgrade para a implementação 'androidx.appcompat: appcompat: 1.0.2'
fonte
No meu caso, um problema estava no método
de uma MainActivity. Não sei por que isso afeta
WebView
.getUserId()
não é substituído, nem método público daActivity
classe. Se eu renomear ou remover este método,WebView
começa a abrir. Também tentando mudarpara
leva à mesma exceção. Eu entendi que, quando tinha visto uma exceção:
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
. Nesse caso, user = 123456 era de fato meu usuário autorizado, que foi usado em algumas solicitações, não emWebView
. Eu suspeito que o Android usauserId
como um user_id local para seus processos.Como muitas outras pessoas notaram, poderíamos usar
appcompat:1.1.0
ou1.0.2
e estender aWebView
aula. No emulador 21 sem o Google Play Services issoWebView
irá travar no toque longo sobre rótulos de texto, mas em dispositivos típicos está tudo bem.fonte
Em vez de alterar a versão de qualquer dependência, implementei a geração de webView de maneira programática como solução.
O problema realmente parece começar com a leitura do layout do arquivo xml. Portanto, se a forma programática é a solução aplicável para você, verifique o exemplo abaixo.
Do que apenas adicionar em sua visualização pai:
fonte
Verifique a versão. Androidx appcompat e Google material version são mantidos sempre iguais.
insira a descrição da imagem aqui
fonte