Android Pie 9.0中isNetworkAvailable()网络检测失效问题求助
解决Android Pie中网络连接检测失败的问题
我来帮你分析下问题根源,以及对应的解决办法:
核心问题1:明文HTTP请求被系统拦截
Android 9.0(Pie)开始默认启用网络安全配置,系统会阻止App发起明文HTTP请求。你代码里调用的http://clients3.google.com/generate_204是HTTP协议,这会导致连接被系统直接拦截,触发异常后执行onUpdateNetworkStatus(false),所以总是显示未连接。
核心问题2:过时API的潜在风险
ConnectivityManager.getActiveNetworkInfo()在Android P及以上已经被标记为过时,虽然它暂时还能工作,但后续版本可能会被彻底移除,建议替换为新的适配API。
快速修复方案(优先推荐)
直接把请求地址改成HTTPS版本,这是最简单高效的解决方式,完全符合Pie的安全要求:
将代码里的:
final URL url = new URL("http://clients3.google.com/generate_204");
替换为:
final URL url = new URL("https://clients3.google.com/generate_204");
备选方案(若必须使用HTTP)
如果因为特殊原因无法切换到HTTPS,可以通过配置网络安全策略允许指定域名的明文流量:
- 在
res/xml目录下创建network_security_config.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">clients3.google.com</domain> </domain-config> </network-security-config>
- 在
AndroidManifest.xml的application标签中添加配置引用:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
适配更高版本的网络状态检测API
为了兼容未来的Android版本,建议把过时的getActiveNetworkInfo()替换为新的API,修正后的完整代码示例:
private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); // 适配Android P及以上的网络状态检测 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Network network = connectivityManager.getActiveNetwork(); if (network == null) { onUpdateNetworkStatus(false); return false; } NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network); if (capabilities == null || !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) || !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { onUpdateNetworkStatus(false); return false; } } else { // 兼容Android 6.0以下版本 NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo == null || !networkInfo.isConnected()) { onUpdateNetworkStatus(false); return false; } } // 发起验证请求(已改为HTTPS) new Thread(() -> { try { URL url = new URL("https://clients3.google.com/generate_204"); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestProperty("User-Agent", "Android"); httpURLConnection.setRequestProperty("Connection", "close"); httpURLConnection.setConnectTimeout(1500); httpURLConnection.connect(); onUpdateNetworkStatus(httpURLConnection.getResponseCode() == 204 && httpURLConnection.getContentLength() == 0); } catch (Exception e) { onUpdateNetworkStatus(false); e.printStackTrace(); } }).start(); return true; }
内容的提问来源于stack exchange,提问作者issamabuaqlien
相关产品推荐
相关产品推荐

