在更新到目标sdk之前,JavaScript无法在Android WebView上运行29

时间:2019-07-02 08:54:18

标签: android 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的困境,而显示了空白的白屏。

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

2 个答案:

答案 0 :(得分:0)

此更改是Android Pie(28)的behavioral changes的一部分。

但是,令人惊讶的是,如果将h2版本设置为28,则带有JS的WebView可以在所有设备上运行。当将其更改为29时,它将在所有实际设备上停止运行,但仍然可以在模拟器中工作。

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

targetSdk

答案 1 :(得分:0)

<块引用>

就我而言,将 SDK 版本 28 更新到 29 webview 不起作用。但在 SDK 版本 28 中工作正常。之后我更改了我的代码,它可以在 SDK 版本 29 中运行

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        WebViewClientImpl webViewClient = new WebViewClientImpl(this);
        webView.setWebViewClient(webViewClient);
        webView.setWebChromeClient(new WebChromeClient());
        webView.loadDataWithBaseURL(null,html_content,"text/html","UTF-8",null);