PAX A920设备(Android Lollipop,SDK22)下NetworkInfo与WifiConfiguration弃用问题及替代方法咨询
解答你的疑问:已弃用API的官方示例问题与替代方案
为什么SDK22官方示例还在用已弃用的类?
其实Android的API弃用机制是这样的:当一个API被标记为@Deprecated,并不意味着它在当前SDK版本中不能用,而是Google在提醒开发者——这个API在未来的Android版本中会被移除,推荐使用新的替代API来保证代码的长期兼容性。
SDK22(Android 5.1)属于比较早期的版本,这些类(NetworkInfo、WifiConfiguration)在当时已经被标记为弃用,但官方的示例代码可能没有及时更新到最新的推荐写法。毕竟示例的主要目的是展示功能实现,而不是强制使用最新API,所以你会看到示例中仍在使用这些已标记弃用的类。
替代已弃用API的具体方案
针对你当前的两个方法,这里给出兼容SDK22的替代实现:
1. 替换isWifiConnected()(替代NetworkInfo)
可以使用ConnectivityManager.getNetworkCapabilities()和NetworkCapabilities来判断WiFi连接状态,这是API21+引入的推荐方式:
public boolean isWifiConnected() { boolean isWifiConnected = false; try { // 获取当前活跃网络 Network activeNetwork = connectivityManager.getActiveNetwork(); if (activeNetwork != null) { NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork); // 检查是否是WiFi传输且已连接 isWifiConnected = networkCapabilities != null && networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CONNECTED); } Log.i(TAG, "wifi adapter is connected? " + isWifiConnected); } catch (Exception ex) { ex.printStackTrace(); } return isWifiConnected; }
如果需要检查所有WiFi网络(不止活跃的),可以遍历所有网络:
public boolean isAnyWifiConnected() { boolean isWifiConnected = false; try { Network[] allNetworks = connectivityManager.getAllNetworks(); for (Network network : allNetworks) { NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network); if (capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CONNECTED)) { isWifiConnected = true; break; } } Log.i(TAG, "any wifi adapter is connected? " + isWifiConnected); } catch (Exception ex) { ex.printStackTrace(); } return isWifiConnected; }
2. 替换removeNetwork()(替代WifiConfiguration)
在SDK22到API28之间,WifiConfiguration虽然被标记为弃用,但仍然可以使用。如果要适配更高版本(API29+),Google推荐使用WifiNetworkSuggestion和相关方法,但针对你的SDK22环境,这里给出兼容的优化写法,同时也说明未来的替代方向:
兼容SDK22的写法(仍可使用,但注意未来版本)
public void removeNetwork() { List<WifiConfiguration> wifiCfgList = wifiManager.getConfiguredNetworks(); if (wifiCfgList != null && !wifiCfgList.isEmpty()) { // 增加空判断,避免空指针 for (WifiConfiguration item : wifiCfgList) { if (item != null) { wifiManager.removeNetwork(item.networkId); } } // 注意:saveConfiguration()在API26已弃用,SDK22中可以用,但更高版本不需要调用 if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) { wifiManager.saveConfiguration(); } } }
API29+的替代方案(供未来升级参考)
如果后续升级到更高版本,需要使用WifiManager.removeNetworkSuggestions()来移除推荐的WiFi网络,示例如下:
public void removeNetworkSuggestions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { List<WifiNetworkSuggestion> suggestions = new ArrayList<>(); // 这里需要构造要移除的WifiNetworkSuggestion对象,匹配要删除的网络 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() .setSsid("YourWiFiSSID") .build(); suggestions.add(suggestion); int result = wifiManager.removeNetworkSuggestions(suggestions); if (result == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { Log.i(TAG, "WiFi suggestion removed successfully"); } else { Log.e(TAG, "Failed to remove WiFi suggestion"); } } }
总结
- 官方示例未更新是因为弃用不代表当前版本不可用,只是提醒未来替换;
- 在SDK22环境下,使用
NetworkCapabilities替代NetworkInfo是安全且推荐的; WifiConfiguration在SDK22仍可使用,但注意saveConfiguration()在API26后已弃用,需要做版本判断。
内容的提问来源于stack exchange,提问作者Sabrina N
相关产品推荐
相关产品推荐

