Android WebView случайным образом не отображает содержимое для одной и той же ссылки

#android #android-webview

#Android #android-webview

Вопрос:

У меня есть ссылка на файл PDF или XML. По умолчанию веб-просмотр не отображает такие ссылки. Из другого сообщения StackOverflow я понял, что мне нужно перенести по ссылке с помощью Google doc или Google drive link (http://docs.google.com/viewer?url=myPDFLink ). Это работает, веб-просмотр отображает содержимое, но не во всех случаях. Для одной и той же ссылки содержимое случайным образом может не отображаться или отображаться. Если страница не отображается, я могу просто повторить попытку несколько раз, и содержимое отобразится. Не могу найти причину такого поведения. Даже если веб-представление пустое, вызывается обратный вызов onPageFinished, но не какие-либо обратные вызовы с ошибками.

  • Обновление: onPageStarted не вызывается, но выполняется onPageFinished

WebViewClient Веб-просмотрщик:

  val webViewClient = object : WebViewClient() {
        override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
            super.onPageStarted(view, url, favicon)
            updateOnBackPressedCallbackState()
            toolbarActivity?.setToolBarTitle(url)
            onPageStateListener?.onPageStarted(view, url)
        }
        override fun onPageFinished(view: WebView, url: String) {
            super.onPageFinished(view, url)
            progressBar?.visibility = View.GONE
            toolbarActivity?.setToolBarTitle(view.title)
            onPageStateListener?.onPageFinished(view)
        }

        override fun onReceivedError(
            view: WebView?,
            errorCode: Int,
            description: String?,
            failingUrl: String?
        ) {
            super.onReceivedError(view, errorCode, description, failingUrl)
        }

        override fun onReceivedError(
            view: WebView?,
            request: WebResourceRequest?,
            error: WebResourceError?
        ) {
            super.onReceivedError(view, request, error)
        }

        override fun onReceivedHttpError(
            view: WebView?,
            request: WebResourceRequest?,
            errorResponse: WebResourceResponse?
        ) {
            super.onReceivedHttpError(view, request, errorResponse)
        }

        override fun onReceivedSslError(
            view: WebView?,
            handler: SslErrorHandler?,
            error: SslError?
        ) {
            super.onReceivedSslError(view, handler, error)
        }
    }
 

Настройки:

     webViewer.webViewClient = webViewClient
    webViewer.settings.javaScriptEnabled = true
    webViewer.isHorizontalScrollBarEnabled = true
    webViewer.settings.mixedContentMode = WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE
 

Ответ №1:

Попробуйте обработать ошибки SSL внутри onReceivedSslError , чтобы продолжить работу с сертификатом

 override fun onReceivedSslError(
    view: WebView?,
    handler: SslErrorHandler?,
    error: SslError?
) = 
    if (handler != null) {
        handler.proceed() 
    } else {
        super.onReceivedSslError(view, handler, error)
    }
 

Комментарии:

1. Я пытался. В моем случае этот обратный вызов никогда не вызывался