You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

API33迁移后Android Studio中WebView显示空白问题求助

API 33迁移后WebView空白问题排查与解决

将应用从API 26迁移至API 33后,WebView出现空白显示,旧API版本下显示正常。现有配置与现象如下:

现有配置

AndroidManifest.xml权限列表

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<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"/>

MainActivity导入代码

import android.app.AlertDialog;
import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.app.ActivityManager;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import java.io.File;
import android.view.WindowManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

import static id.ztha.elmusman12.elmulite.DetectConnection.isNetworkStatusAvialable;

异常现象

  • Android Studio中ConnectivityManager的过时方法及NetworkInfo类呈灰色标记
  • 模拟器运行时WebView空白,界面如下:
    WebView空白界面

解决方案

1. 替换过时的网络检测逻辑

NetworkInfo类及ConnectivityManager.getActiveNetworkInfo()方法在API 29+已过时,旧逻辑在API 33下可能返回错误的网络状态,导致WebView未触发加载。修改DetectConnection类中的isNetworkStatusAvialable方法:

public static boolean isNetworkStatusAvialable(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) 
            context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager == null) return false;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // API 23+ 采用NetworkCapabilities检测网络
        Network network = connectivityManager.getActiveNetwork();
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
        return capabilities != null && (
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
                capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
        );
    } else {
        // 兼容API <23的旧版本
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
    }
}

2. 调整WebView适配API 33配置

API 33对WebView的安全策略和默认配置有收紧,添加以下关键配置:

private void initWebView() {
    WebView webView = findViewById(R.id.webview);
    WebSettings webSettings = webView.getSettings();

    // 启用JavaScript(若页面依赖该功能)
    webSettings.setJavaScriptEnabled(true);
    // 启用DOM存储(部分页面需要存储临时数据)
    webSettings.setDomStorageEnabled(true);
    // 允许混合内容(若页面同时包含HTTP和HTTPS资源)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
        // 若兼容性模式仍有问题,可临时使用ALWAYS_ALLOW(注意安全风险)
        // webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    }

    // 设置WebViewClient拦截加载错误,便于排查问题
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            Log.e("WebViewError", "加载失败:" + description + ",URL:" + failingUrl);
            Toast.makeText(MainActivity.this, "页面加载失败:" + description, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d("WebViewStatus", "页面加载完成:" + url);
        }
    });

    // 检查网络后加载目标页面
    if (DetectConnection.isNetworkStatusAvialable(this)) {
        webView.loadUrl("你的目标页面URL");
    } else {
        Toast.makeText(this, "网络不可用", Toast.LENGTH_SHORT).show();
    }
}

3. 排查加载日志与系统限制

  • 通过Logcat过滤WebViewError和WebViewStatus标签,查看具体错误信息(如SSL证书错误、资源加载失败)
  • 确认Manifest中未设置android:hardwareAccelerated="false"(WebView依赖硬件加速)
  • 检查应用是否被系统限制网络访问(如后台网络权限)

内容的提问来源于stack exchange,提问作者Terizla Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:55:00