Я пытаюсь создать простое приложение с помощью 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"
...
/>
network_security_config
<?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 и Network Security, а также различные примеры из Интернета, но мне ничего не помогает...
С интернетом всё в порядке, запросы с помощью Retrofit2 обрабатываются без проблем
Кроме того, onReceivedError, onReceivedSslError и onReceivedHttpError не обнаружен
Работают только onPageStarted и onPageFinished.
@Ivo Все еще белый экран
Возможно глупый вопрос, а вы вообще звоните initWebView()?
@Ivo Это нормальный вопрос) Я вызываю его внутри метода onCreate после setContentView()
Ладно, странно. Для меня это работает нормально
@ivo Проверьте мой ответ на этот вопрос, я думаю, это уникальная проблема)




Я нашел в чем проблема!
Изначально мое приложение построено на Compose, и я пытался использовать WebView из View.
Я использовал пример отсюда:
Android WebView с Jetpack Compose не отображает компоненты Mantine UI (React) должным образом
и это сработало успешно
что, если вы используете
"https://www.google.com"вместо"https://google.com"?