首页 > 解决方案 > 在更新到目标 sdk 29 之前,Javascript 无法在 Android WebView 上运行

问题描述

我正在将本地 html 文件的内容加载到 WebView 中:

context?.assets?.open("SeatingPlan.html")?.bufferedReader().use {
        val some = it?.readText()
        some.let {
            val finalHTML = some!!.replace("{PERFORMANCE-ID}", occurrence.id.toString())
            binding.webView.addJavascriptInterface(SeatingPlanWebAppInterface { ticketData: String ->
                handleTicketSelection(ticketData)
            }, "Android")
            binding.webView.loadData(finalHTML, "text/html; charset=utf-8", "UTF-8")
        }
    }

然后,我有一个监听器,以便在加载完成后触发一些 javascript 函数,如下所示:

binding.webView.settings.javaScriptEnabled = true
    binding.webView.webViewClient = object : WebViewClient() {
        override fun onPageFinished(view: WebView, url: String) {
            super.onPageFinished(view, url)
            binding.webView.loadUrl("javascript:(function() {" + "document.addEventListener('LTD.SeatPlan.OnSeatSelected', e => {Android.seatSelected(JSON.stringify(e.detail))});" + "document.addEventListener('LTD.SeatPlan.OnSeatUnselected', e => {Android.seatUnSelected(JSON.stringify(e.detail))});" + "})();")
        }
    }

相同的代码对于我的应用程序的所有受支持的 android 版本(5.0+)都运行良好,而现在,在更新到目标 sdk 29 后,它卡在加载 html 中,而是显示一个空白的白色屏幕。

我认为该问题可能与对SDK29 所做的更改有关,但不知道在哪里寻找解决方案。我认为它可能是目标29 问题的原因是与所做SDK的最新更改有关: https ://developer.android.com/about/versions/pie/android-9.0-migration 。有解决方法吗?WebView

标签: androidandroid-webview

解决方案


此更改是Android Pie (28)的行为更改的一部分。

但是,令人惊讶的是WebView,如果版本设置为 28,with JS 将适用于所有设备targetSdk。当您将其更改为 29 时,它会停止在所有真实设备中运行,但它仍然可以在模拟器中运行。

您需要在初始化 WebView 之前调用静态方法setDataDirectorySuffix才能使其正常工作。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    WebView.setDataDirectorySuffix("your-suffix");
}

推荐阅读