NetworInfo.isAvailable
和NetworkInfo.isConnected
只能表明网络连接是否可能或存在,它们无法表明连接情况是否可以访问公共互联网,简而言之,它们不能告诉我们设备确实在线。
要检查设备是否在线,请尝试以下方法:
第一种方法:
@TargetApi(Build.VERSION_CODES.M)
public static boolean isNetworkOnline1(Context context) {
boolean isOnline = false;
try {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkCapabilities capabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
isOnline = capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
} catch (Exception e) {
e.printStackTrace();
}
return isOnline;
}
强项:1.可以在UI线程上运行;2.快速且准确。
弱项:需要API>=23,且存在兼容性问题。
第二点:
public static boolean isNetworkOnline2() {
boolean isOnline = false;
try {
Runtime runtime = Runtime.getRuntime();
Process p = runtime.exec("ping -c 1 8.8.8.8");
int waitFor = p.waitFor();
isOnline = waitFor == 0;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return isOnline;
}
优点:1. 可以在UI线程上运行;2. 您可以多次ping并统计最小/平均/最大延迟时间和丢包率。
缺点:兼容性问题。
第三点:
public static boolean isNetworkOnline3() {
boolean isOnline = false;
try {
URL url = new URL("http://www.google.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Connection", "close");
conn.setConnectTimeout(3000);
isOnline = conn.getResponseCode() == 200;
} catch (IOException e) {
e.printStackTrace();
}
return isOnline;
}
优点:可在所有设备和API上使用。
缺点:操作耗时,不能在UI线程上运行。
第四:
public static boolean isNetworkOnline4() {
boolean isOnline = false;
try {
Socket socket = new Socket();
socket.connect(new InetSocketAddress("8.8.8.8", 53), 3000);
isOnline = true;
} catch (IOException e) {
e.printStackTrace();
}
return isOnline;
}
优点:1. 可在所有设备和API上使用;2. 相对快速且准确。
缺点:操作耗时,不能在UI线程上运行。