1、获取网络信息,首先需要获取权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.1我们通过ConnectivityManager可以获取状态,但是我们需要考虑到Android版本不同获取方式不同。
2.1.1hasCapability可以判断网络是否连接,常用参数如下:
?NetworkCapabilities.NET_CAPABILITY_INTERNET:判断是否连上网
NetworkCapabilities.NET_CAPABILITY_VALIDATED:判断当前是否能上网,但是发现小米11Android12添加证书后,一直是false
?
private static boolean netWorkState(Context context) {
if (context != null) {
try {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// 通过版本去判断
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Network network = connectivityManager.getActiveNetwork();
//network 为空,则表示没有网络
if (network != null) {
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
// NetworkCapabilities 为空,则表示没有网络
if (capabilities != null) {
//capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) 小米11,android 12系统这个值一直是false
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
}
}
} else {
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if (info != null) {
return info.isAvailable();
}
}
return false;
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}
2.1.2hasCapability可以判断网络类型,常用参数如下:
NetworkCapabilities.TRANSPORT_WIFI:表示接入的是WIFI网络
NetworkCapabilities.TRANSPORT_CELLULAR:表示接入的是数据网络
public static void networkType(NetworkCapabilities networkCapabilities) {
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
//当前在使用Mobile流量上网
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
//当前在使用WiFi上网
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
//当前使用蓝牙上网
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
//当前使用以太网上网
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
当前使用VPN上网
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {
//表示此网络使用Wi-Fi感知传输
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {
//表示此网络使用LoWPAN传输
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {
//表示此网络使用USB传输
} else {
//未知
}
}
2.2异步通过registerDefaultNetworkCallback获取网络状态(华为手机,在使用过程,网络状态不准确)
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
//注册 NetworkCallBack
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(networkCallBack);
}
}
2.2.1networkCallBack
private ConnectivityManager.NetworkCallback networkCallBack = new ConnectivityManager.NetworkCallback() {
private static final String TAG = "TAG";
@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
if (NetworkUtils.netWorkState(getBaseContext())) {
Log.i(TAG, "onCapabilitiesChanged ---> ====网络可正常上网===网络类型为: " + NetworkUtils.networkType(MainActivity.this));
}
}
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
Log.i(TAG, "==网络连接成功,通知可以使用的时候调用====onAvailable===");
}
@Override
public void onUnavailable() {
super.onUnavailable();
Log.i(TAG, "==当网络连接超时或网络请求达不到可用要求时调用====onUnavailable===");
}
@Override
public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
super.onBlockedStatusChanged(network, blocked);
Log.i(TAG, "==当访问指定的网络被阻止或解除阻塞时调用===onBlockedStatusChanged==");
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Log.i(TAG, "==当网络正在断开连接时调用===onLosing===");
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
Log.i(TAG, "==当网络已断开连接时调用===onLost===");
}
@Override
public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
Log.i(TAG, "==当网络连接的属性被修改时调用===onLinkPropertiesChanged===");
}
};
2.3异步通过ping方式判断网络状态
try {
Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec("ping -c 1 8.8.8.8");
int waitFor = p.waitFor();
return waitFor == 0;
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return false;