web-dev-qa-db-ja.com

android.view.InflateExceptionクラスの膨張エラーAndroid.webkit.WebView

Lollipop(API 22)では、アプリケーションでWebviewを表示するたびにアプリケーションがクラッシュします。このイベントに関連するAndroid開発者コンソールに複数のクラッシュがあります。

Android 4、6、7で動作することは言うまでもありません。

スタックトレース(この投稿の最後に投稿)を読んで、何かが私をバグ

Caused by: Android.content.res.Resources$NotFoundException: String resource ID #0x2040003

明らかにIDが存在しないため、生成されたR.Javaを検索しましたが、運が悪かったのですが、試す価値はありました。

問題をグーグルで調べるのは、LollipopがWebビューを処理する方法に関連しているようです。 GDCのクラッシュレポーターで見つけたデバイスに基づいて、Lollipopで新しいAVDを開始しました。問題を再現できます。


完全なスタックトレース:

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) 
93
Valerio

「androidx.appcompat:appcompat:1.1.0」を使用する場合は、代わりに「androidx.appcompat:appcompat:1.0.2」を試してください。 1.1.0は、Android 5.1.1。

6
戴文锦

XMLレイアウトからWebViewを膨らませたい場合は、( ikostetの回答 に基づいて)素敵な小さなサブクラスでラップできます。

public class LollipopFixedWebView extends WebView {
    public LollipopFixedWebView(Context context) {
        super(getFixedContext(context));
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs) {
        super(getFixedContext(context), attrs);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(getFixedContext(context), attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.Lollipop)
    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(getFixedContext(context), attrs, defStyleAttr, defStyleRes);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
        super(getFixedContext(context), attrs, defStyleAttr, privateBrowsing);
    }

    public static Context getFixedContext(Context context) {
        return context.createConfigurationContext(new Configuration());
    }
}

編集:Kotlinでさらに便利になりました

class LollipopFixedWebView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
) : WebView(context.createConfigurationContext(Configuration()), attrs, defStyleAttr, defStyleRes)
17
SpaceBison

Webviewの作成に使用してみてください:

mWebView = new WebView(getActivity().createConfigurationContext(new Configuration()));
10
ikostet

Nexus 7 API 22でこの問題を再現できました。この問題は、タブレットのバージョンAndroid System WebView fromversion 39(2237560 -arm)からversion 79.0.3945.136

これをユーザーが制御することはできませんが、誰かがアプリをすぐに使用できるようにする必要がある場合の解決策です。

0
TGruenwald

以下のコードは問題を修正します。 Activityに追加してください:

@Override 
   public AssetManager getAssets() { return getResources().getAssets(); 
}
0
avinasha

私の場合、問題は方法にありました

_fun getUserId(): Int = userId
_

mainActivityの。なぜWebViewに影響するのかわかりません。 getUserId()はオーバーライドされておらず、Activityクラスのパブリックメソッドでもありません。このメソッドの名前を変更または削除すると、WebViewが開き始めます。また変更しようとしています

_private var userId: Int = 0
_

_var userId: Int = 0
    private set
_

同じ例外が発生します。例外を見たとき、_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_であることがわかりました。その場合、user = 123456は実際にはWebViewではなく一部の要求で使用された私の承認済みユーザーでした。 Androidはそのプロセスのローカルuser_idとしてuserIdを使用していると思います。

他の多くの人々が気づいたように、_appcompat:1.1.0_または_1.0.2_を使用してWebViewクラスを拡張することができます。 Google Play開発者サービスのないエミュレータ21では、このWebViewはテキストラベルを長押しするとクラッシュしますが、通常のデバイスではすべて問題ありません。

0
CoolMind