Android WebView не может загрузить веб-страницу и возвращает белый экран

Я пытаюсь создать простое приложение с помощью 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.

что, если вы используете "https://www.google.com" вместо "https://google.com"?

Ivo 14.03.2024 15:11

@Ivo Все еще белый экран

jose4ka 14.03.2024 15:19

Возможно глупый вопрос, а вы вообще звоните initWebView()?

Ivo 14.03.2024 15:23

@Ivo Это нормальный вопрос) Я вызываю его внутри метода onCreate после setContentView()

jose4ka 14.03.2024 15:29

Ладно, странно. Для меня это работает нормально

Ivo 14.03.2024 15:35

@ivo Проверьте мой ответ на этот вопрос, я думаю, это уникальная проблема)

jose4ka 14.03.2024 15:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел в чем проблема!

Изначально мое приложение построено на Compose, и я пытался использовать WebView из View.

Я использовал пример отсюда:

Android WebView с Jetpack Compose не отображает компоненты Mantine UI (React) должным образом

и это сработало успешно

Другие вопросы по теме