You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 16(API 35)下WebView初始化触发Resources$NotFoundException崩溃问题求助

Android 16(API 35)下WebView初始化触发Resources$NotFoundException崩溃问题求助

各位好,我最近在开发Android应用时碰到了一个棘手的问题,想请教下大家:

我在Android 16(API 35)的设备上初始化WebView时频繁触发崩溃,而且崩溃发生在加载任何URL之前,刚好是WebView实例创建的阶段。

已尝试的解决手段

  • 放弃XML中静态声明WebView,改用纯代码动态创建
  • 在添加新的WebView实例前,先清空容器内的所有视图
  • 简化WebView配置,只保留最必要的基础设置(比如JS启用、DOM存储等)

崩溃日志

Fatal Exception: android.util.AndroidRuntimeException: 
android.content.res.Resources$NotFoundException: failed to redirect ResourcesImpl
    at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:405)
    at android.webkit.WebView.getFactory(WebView.java:2646)
    at android.webkit.WebView.ensureProviderCreated(WebView.java:2640)
    at android.webkit.WebView.setOverScrollMode(WebView.java:2723)
    at android.view.View.<init>(View.java:6154)
    at android.view.View.<init>(View.java:6315)
    at android.view.ViewGroup.<init>(ViewGroup.java:727)
    at android.widget.AbsoluteLayout.<init>(AbsoluteLayout.java:56)
    at android.webkit.WebView.<init>(WebView.java:425)
    at android.webkit.WebView.<init>(WebView.java:367)
    at android.webkit.WebView.<init>(WebView.java:349)
    at android.webkit.WebView.<init>(WebView.java:336)
    at android.webkit.WebView.<init>(WebView.java:326)

相关代码片段

动态创建WebView的核心代码

private fun loadWebView(link: String) {
    val container = binding.root.findViewById<FrameLayout>(R.id.webViewContainer)
    container.removeAllViews()
    
    mWebView = WebView(this).apply {
        layoutParams = FrameLayout.LayoutParams(
            FrameLayout.LayoutParams.MATCH_PARENT,
            FrameLayout.LayoutParams.MATCH_PARENT
        )
        
        val settings: WebSettings = getSettings()
        settings.javaScriptEnabled = true
        settings.domStorageEnabled = true
        settings.allowFileAccess = true
        settings.allowContentAccess = true
        settings.loadsImagesAutomatically = true
        settings.setSupportMultipleWindows(true)

        addJavascriptInterface(WebAppInterface(this@MainActivity), "Android")
        
        webViewClient = object : WebViewClient() {
            override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                binding.progressBar.visibility = View.VISIBLE
            }

            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(view, url)
                binding.progressBar.visibility = View.GONE
            }

            override fun shouldOverrideUrlLoading(
                view: WebView?,
                request: WebResourceRequest?
            ): Boolean {
                view?.loadUrl(request?.url.toString())
                return true
            }
        }
        
        webChromeClient = object : WebChromeClient() {
            override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
                Log.d("WebView", "Console message: ${consoleMessage?.message()}")
                return super.onConsoleMessage(consoleMessage)
            }
            
            override fun onShowFileChooser(
                webView: WebView?,
                filePathCallback: ValueCallback<Array<Uri>>?,
                fileChooserParams: FileChooserParams?
            ): Boolean {
                // File chooser implementation
                return true
            }
        }
    }
    
    container.addView(mWebView)
    mWebView?.loadUrl(link)
}

与WebView交互的Javascript接口类

class WebAppInterface(private val mContext: Context) {
    @JavascriptInterface
    fun showToast(toast: String) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show()
    }
}

我的疑问

  • 这是Android 16与WebView初始化相关的已知问题吗?
  • 有没有针对动态创建WebView时出现的Resources$NotFoundException的可行 workaround?
  • 在Android 16上,我是不是应该换一种WebView初始化的方式?
  • 这个问题会不会和WebView的版本兼容性有关?

火山引擎 最新活动