ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有啥替代方案?
Posted
技术标签:
【中文标题】ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有啥替代方案?【英文标题】:ConnectivityManager.getActiveNetworkInfo() / NetworkInfo is deprecated in API 29. What's an alternative?ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有什么替代方案? 【发布时间】:2019-11-20 20:48:09 【问题描述】:看起来像 API 29 上的整个 NetworkInfo is deprecated。
所以我正在寻找一种替代方法来检查网络是否已连接。 例如。替代
connectivityManager.activeNetworkInfo?.isConnected == true
旁注:我知道现在有回调,但我想同步获取此信息。另外,我当然知道这可能不是一个准确的信息,尽管我想拥有它。
【问题讨论】:
查看***.com/a/56437236/7666442 您链接到的确切页面描述了存在哪些替代方案。 【参考方案1】:解决办法是这样的:
val capability = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false
【讨论】:
在此确认:developer.android.com/training/basics/network-ops/…【参考方案2】:这适用于 API 29:
connectivityManager.isDefaultNetworkActive
【讨论】:
这似乎仍然返回true,即使在飞行模式下。 在飞行模式下可以有一个活跃的网络。引用Techopedia:In general, features like FM receiver, Bluetooth, Wi-Fi and GPS should still be operable even when the device is in airplane mode
【参考方案3】:
android.net.NetworkInfo
此类在 API 级别 29 中已弃用。
您应该改用ConnectivityManager.NetworkCallback
API 来了解连接更改
参考链接https://developer.android.com/reference/android/net/NetworkInfo.html
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
connectivityManager.registerNetworkCallback(
builder.build(),
new ConnectivityManager.NetworkCallback()
@Override
public void onAvailable(Network network)
// Network Available
@Override
public void onLost(Network network)
// Network Not Available
);
【讨论】:
【参考方案4】:解决办法是
public void registerNetworkCallback()
try
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback()
@Override
public void onAvailable(Network network)
Variables.isNetworkConnected = true; // Global Static Variable
@Override
public void onLost(Network network)
Variables.isNetworkConnected = false; // Global Static Variable
);
Variables.isNetworkConnected = false;
catch (Exception e)
Variables.isNetworkConnected = false;
在此处查看完整代码:Gist
【讨论】:
【参考方案5】:private boolean checkInternetConnection(Activity activity)
ConnectivityManager connectivityManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
Network network = null;
if (connectivityManager == null)
return false;
else
network = connectivityManager.getActiveNetwork();
NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
if (networkCapabilities == null)
return false;
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
return true;
else
if (connectivityManager == null)
return false;
if (connectivityManager.getActiveNetworkInfo() == null)
return false;
return connectivityManager.getActiveNetworkInfo().isConnected();
return false;
【讨论】:
感谢您对社区的贡献。这可能是一个正确的答案,但对您的代码提供额外的解释会很有用,以便开发人员能够理解您的推理。这对于可能不熟悉语法的新开发人员特别有用。此外,它可以帮助减少对后续问题的需求。您介意用更多详细信息更新您的评论吗?以上是关于ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有啥替代方案?的主要内容,如果未能解决你的问题,请参考以下文章