android - 在更新到目标 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 中,而是显示一个空白的白色屏幕。
我认为该问题可能与对SDK
29 所做的更改有关,但不知道在哪里寻找解决方案。我认为它可能是目标29 问题的原因是与所做SDK
的最新更改有关: https ://developer.android.com/about/versions/pie/android-9.0-migration 。有解决方法吗?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");
}
推荐阅读
- spring-aop - 这个切入点在 Spring AOP 中是如何工作的?
- c# - 从 WPF 数据网格中当前选定的行获取值的最佳方法是什么?
- pytorch - TypeError:“NoneType”对象在 pytorch 中的 loss.backward 中不可迭代
- react-native - Expo 的 SecureStore 能持续多久?
- python-3.x - 如何使用 BS4 获取 html 正文的特定部分
- ffmpeg - 转换为 HLS VS MPEGTS
- java - java.lang.NoClassDefFoundError 异常:使用 JUnit 运行黄瓜测试时的 gherkin/util/FixJava
- postgresql - 使用 postgresql 在同一个表上创建自动更新另一行的触发器
- python - python可以制作遮挡图像吗?
- node.js - 随机渲染页面内容在 AWS CloudFront (node.js) 上不起作用