Android 网络状态判断
1、获取网络信息,首先需要获取权限
(图片来源网络,侵删)
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;
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。