如何在安卓中检索活动网络信息



我一直在开发一个安卓应用程序。对于其中一个功能,我需要活动网络信息(即它是否与Wi-Fi或移动数据连接(。我从互联网上得到了这段代码。

NetworkInfo activeNetworkInfo = context.getSystemService(ConnectivityManager.class).getActiveNetworkInfo();

但是这个 API 已弃用,我不想使用任何已弃用的 API。

经过更多的谷歌搜索,我发现我们应该使用ConnectivityManager.NetworkCallback。但我无法得到一个例子。我该如何使用它?如果有人对使用ConnectivityManager.NetworkCallback有想法,请帮助我

在 Kotlin 中查看此函数

fun networkConnection(): Boolean {
var networkAvailable = false
val connectivityManager: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network: Network = connectivityManager.activeNetwork!!
val networkCapabilities: NetworkCapabilities = connectivityManager.getNetworkCapabilities(network)!!
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
networkAvailable = true
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
networkAvailable = true
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
networkAvailable = true
}
return networkAvailable
}

尝试以下代码:

private void registerNetworkCallback(Context context) {
final ConnectivityManager manager =
(ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
manager.registerNetworkCallback(
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
.build(),
new NetworkCallback() {
@Override
public void onAvailable(Network network) {
/** here to get the available info
this ternary operation is not quite true, because non-metered 
doesn't yet mean, that it's wifi
nevertheless, for simplicity let's assume that's true
*/
Log.i("vvv", "connected to " + (manager.isActiveNetworkMetered() ? "LTE" : "WIFI"));
}
@Override
public void onCapabilitiesChanged(Network network, 
NetworkCapabilities networkCapabilities){
/**here to get the change network info
Value is TRANSPORT_CELLULAR, TRANSPORT_WIFI, 
TRANSPORT_BLUETOOTH, TRANSPORT_ETHERNET, TRANSPORT_VPN
*/
if(networkCapabilities.hasTransport("type")){
}
}
});
}
connectivityManager = (ConnectivityManager) 
context.getSystemService(ConnectivityManager.class);

@RequiresApi(api = Build.VERSION_CODES.M)
private void getActiveNet() {
Network currentNetwork = connectivityManager.getActiveNetwork();
}

请注意,"活动网络"在Android中是"默认网络"的同义词。

ConnectivityManager#getActiveNetworkInfo((

返回有关当前活动的默认数据网络的详细信息...

ConnectivityManager#registerDefaultNetworkCallback(NetworkCallback(

注册以接收有关应用程序更改的通知 默认网络...

因此,使用ConnectivityManager#registerDefaultNetworkCallback(NetworkCallback)您可以侦听默认(也称为"活动"(网络更改。不幸的是,这只返回没有关于传输(Wi-Fi vs 蜂窝(信息的Network对象,在这种情况下,您需要对 ConnectivityManager#getNetworkCapabilities(Network( 进行额外调用才能获取该信息。

下面是一个示例:

final ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkCallback networkCallback = new NetworkCallback() {
@Override
void onAvailable(Network network) {
// Triggers when a default network is available.
NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(network);
boolean isWifi = nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
boolean isCellular = nc.hasTransport(NetworkCapabilities. TRANSPORT_CELLULAR);
}
};
connectivityManager.registerDefaultNetworkCallback(networkCallback);

最新更新