Webview android studio 仅白色或黑色显示

问题描述 投票:0回答:1

为什么我的 android webview 上没有显示,如果我尝试其他网址,例如 www.youtube.com 它工作正常,如果通过浏览器搜索 infoinfopedia 网址,则会出现警告“您的连接不是私有的”,但仍然可以如果按高级选项可以看到,但在网络视图中只有黑色或白色显示。有办法解决吗?

我的代码:

package com.example.myapplication

import android.annotation.SuppressLint
import android.content.Context
import android.net.ConnectivityManager
import android.net.http.SslError
import android.os.Build
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import android.view.WindowInsets
import android.view.WindowManager
import android.webkit.SslErrorHandler
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.ProgressBar
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {
    lateinit var loading: ProgressBar
    private lateinit var url: String
    private lateinit var webView: WebView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setFullscreen()
        init()
        setupUI()
    }

    private fun setFullscreen(){
        //Menyembunyikan action bar
        supportActionBar?.hide()
        //Mengatur layout menjadi Full Screen
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            window.insetsController?.hide(WindowInsets.Type.statusBars())
        } else {
            window.setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN
            )
        }
    }

    private fun init(){
        url = "https://infoinfopedia.kesug.com/login.php"
        loading = findViewById<ProgressBar>(R.id.pb_loading)
        webView = findViewById<WebView>(R.id.wv_page)
    }

    private fun setupUI(){
        if (isOnline(this)){
            loadWebview()
        } else {
            Toast.makeText(this, "Tidak ada koneksi internet", Toast.LENGTH_SHORT).show()
        }
    }

    @SuppressLint("ServiceCast")
    fun isOnline(context: Context): Boolean {
        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connectivityManager.activeNetworkInfo
        return networkInfo != null && networkInfo.isConnectedOrConnecting
    }

    private fun loadWebview(){
        webView.webViewClient = myWebclient()
        webView.settings.javaScriptEnabled = true
        webView.loadUrl(url)
    }

    inner class myWebclient: WebViewClient() {
        override fun onPageFinished(view:WebView, url:String) {
            super.onPageFinished(view, url)
            loading.visibility = View.GONE
        }

        override fun shouldOverrideUrlLoading(view:WebView, url: String):Boolean {
            view.loadUrl(url)
            return true
        }
    }

    override fun onKeyDown(keyCode:Int, event: KeyEvent):Boolean {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack()
            return true
        }
        return super.onKeyDown(keyCode, event)
    }
    fun onReceivedSslError(view: WebView?, handler: SslErrorHandler, error: SslError?) {
        handler.proceed() // Ignore SSL certificate errors
    }
}

我已尝试添加

 fun onReceivedSslError(view: WebView?, handler: SslErrorHandler, error: SslError?) {
        handler.proceed() // Ignore SSL certificate errors
    }
android webview
1个回答
0
投票

看来您已经实现了

onReceivedSslError
方法来忽略 SSL 证书错误,这是一个很好的步骤。但是,您需要确保正在调用该方法。在您当前的代码中,此方法没有被正确覆盖。您应该重写
onReceivedSslError
类中的
WebViewClient
方法,而不是将其添加为单独的函数。

这是修改后的代码:

inner class MyWebClient : WebViewClient() {
    override fun onPageFinished(view: WebView, url: String) {
        super.onPageFinished(view, url)
        loading.visibility = View.GONE
    }

    override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
        view.loadUrl(url)
        return true
    }

    override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler, error: SslError?) {
        handler.proceed() // Ignore SSL certificate errors
    }
}

private fun loadWebview() {
    webView.webViewClient = MyWebClient()
    webView.settings.javaScriptEnabled = true
    webView.loadUrl(url)
}

确保将当前的

myWebclient
替换为正确覆盖
MyWebClient
方法的新
onReceivedSslError
类。

此外,请确保 SSL 错误确实与证书相关,而不是其他问题。如果它仍然不起作用,您可能需要通过覆盖

onReceivedError
类中的
WebViewClient
方法来检查 WebView 的错误消息以获取更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.