我正在尝试使用 WebView 创建一个简单的应用程序,它应该简单地打开网站“google.com”
但是,我得到的不是网站,而是白屏,没有任何错误等。
你能看看我做错了什么吗?
我的代码:
主要活动
private fun initWebView() {
binding.mainWebView.webViewClient = MyWebClient()
binding.mainWebView.settings.javaScriptEnabled = true
binding.mainWebView.settings.cacheMode = WebSettings.LOAD_DEFAULT
binding.mainWebView.settings.domStorageEnabled = true
binding.mainWebView.settings.blockNetworkImage = false
binding.mainWebView.settings.blockNetworkLoads = false
binding.mainWebView.settings.loadsImagesAutomatically = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
binding.mainWebView.settings.safeBrowsingEnabled = false
}
binding.mainWebView.settings.javaScriptCanOpenWindowsAutomatically = true
binding.mainWebView.settings.allowFileAccess = true
binding.mainWebView.settings.useWideViewPort = true
binding.mainWebView.fitsSystemWindows = true
binding.mainWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null)
binding.mainWebView.loadUrl("https://google.com")
}
我的网络客户端
class MyWebClient : WebViewClient() {
val TAG = "===MyWebClient"
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
view!!.loadUrl(request!!.url.toString())
return true
}
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
view!!.loadUrl(url!!)
return true
}
override fun onReceivedHttpError(
view: WebView?,
request: WebResourceRequest?,
errorResponse: WebResourceResponse?
) {
Log.i(TAG, "onReceivedHttpError: http error ")
super.onReceivedHttpError(view, request, errorResponse)
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
Log.i(TAG, "onReceivedError: ${error!!.errorCode}")
Log.i(TAG, "onReceivedError: ${error.description}")
}
override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
handler!!.proceed()
Log.i(TAG, "onReceivedSslError: ${error}")
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
Log.i(TAG, "onPageStarted: started ${url}")
super.onPageStarted(view, url, favicon)
}
override fun onPageFinished(view: WebView?, url: String?) {
Log.i(TAG, "onPageFinished: finished ${url}")
super.onPageFinished(view, url)
}
}
Android 清单
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
...
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
...
/>
网络安全配置
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">google.com</domain>
<domain includeSubdomains="true">www.google.com</domain>
</domain-config>
</network-security-config>
我使用clearTextTraffic和网络安全,以及互联网上的各种示例,但没有任何帮助我......
互联网一切正常,使用Retrofit2的请求处理顺利
此外,onReceivedError、onReceivedSslError 和 onReceivedHttpError 未捕获
仅 onPageStarted 和 onPageFinished 有效
我找到问题所在了!
最初,我的应用程序是基于 Compose 构建的,我尝试从 View 使用 WebView。
我使用了这里的一个例子:
使用 Jetpack Compose 的 Android WebView 无法正确渲染 Mantine UI (React) 组件
并且成功了