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)
「androidx.appcompat:appcompat:1.1.0」を使用する場合は、代わりに「androidx.appcompat:appcompat:1.0.2」を試してください。 1.1.0は、Android 5.1.1。
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)
Webviewの作成に使用してみてください:
mWebView = new WebView(getActivity().createConfigurationContext(new Configuration()));
Nexus 7 API 22でこの問題を再現できました。この問題は、タブレットのバージョンAndroid System WebView fromversion 39(2237560 -arm)からversion 79.0.3945.136
これをユーザーが制御することはできませんが、誰かがアプリをすぐに使用できるようにする必要がある場合の解決策です。
以下のコードは問題を修正します。 Activity
に追加してください:
@Override
public AssetManager getAssets() { return getResources().getAssets();
}
私の場合、問題は方法にありました
_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
はテキストラベルを長押しするとクラッシュしますが、通常のデバイスではすべて問題ありません。