返回

解决 Android Studio Webview 中的黑白屏幕问题:全面指南

Android

Android Studio Webview 中的黑白屏幕问题:解决方案

问题

在 Android Studio 的 Webview 中加载某些 URL 时,你可能会遇到一个白色或黑色屏幕,而其他 URL 却可以正常显示。这种情况通常发生在 URL 具有无效安全证书或设备未连接到 Internet 时。

解决方法

1. 检查安全证书

首先,检查问题 URL 的安全证书是否有效。无效的证书会导致 Webview 无法正确显示 URL。确保 URL 使用有效的 SSL 证书。

2. 忽略 SSL 错误

如果无法获得有效的证书,你可以忽略 SSL 错误。为此,在你的 WebViewClient 中添加以下方法:

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

3. 检查网络连接

确保你的设备已连接到 Internet。你可以使用以下方法检查网络连接:

@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
}

完整解决方案

以下代码包含所有这些解决方案:

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 onReceivedSslError(view: WebView?, handler: SslErrorHandler, error: SslError?) {
            handler.proceed() // Ignore SSL certificate errors
        }
    }

    override fun onKeyDown(keyCode:Int, event: KeyEvent):Boolean {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack()
            return true
        }
        return super.onKeyDown(keyCode, event)
    }
}

结论

通过遵循这些步骤,你应该能够解决 Android Studio Webview 中的白色或黑色屏幕问题。始终记住检查 URL 的安全证书,忽略 SSL 错误,并确保你的设备已连接到 Internet。