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空白,界面如下:

解决方案
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
相关产品推荐
相关产品推荐

