处理互联网连接:特例
Handling Internet Connection: Special Case
假设有两台手机A和B,打开手机A的热点,连接手机B。
现在关闭手机A的移动数据。
手机B有可用网络但无法连接,因为手机A的移动数据已关闭
如何在编码中处理这个问题?
我正在这样检查 Internet 连接。
public boolean isNetworkConnected() {
boolean connected = false;
ConnectivityManager connectivityManager;
connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
connected = networkInfo != null && networkInfo.isAvailable() &&
networkInfo.isConnected();
return connected;
}
从Activity开始,我就是这样做的。
if (isNetworkConnected()) {
// Connection Available
} else {
// No Connection
}
它应该在 else 部分出现,但它没有出现。
在清单中添加 ACCESS_NETWORK_STATE 权限。
要检测实际的互联网连接,您需要使用 Ping 进行测试,例如,此代码将 ping www.google.com 以检查连接,它与使用 ping 命令相关(因为它的可靠性),如果没有在发生错误时可用,它回退到 InetAddress isReachable 方法。
public boolean isConnected(){
try{
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
return returnVal==0;
} catch(Exception e){
//fallback to java's ICMP implementation
return InetAddress.getByName("8.8.8.8").isReachable(1000);
}
}
您可能需要对 URI 执行 openConnection()
。尝试在 runnable 中使用以下代码:
public boolean isHostReachable() {
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
try{
URI uri = new URI(YOUR_URL_HERE);
String domainName = uri.getScheme() + "://" + uri.getRawAuthority();
URL url = new URL(domainName);
URLConnection urlConn = url.openConnection();
urlConn.connect();
return true;
} catch (IOException | URISyntaxException e) {
return false;
}
您也可以使用 InetAddress 检查
public boolean isInternetAvailable() {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
//You can replace it with your name
return !ipAddr.equals("");
} catch (Exception e) {
return false;
}
}
假设有两台手机A和B,打开手机A的热点,连接手机B。 现在关闭手机A的移动数据。 手机B有可用网络但无法连接,因为手机A的移动数据已关闭
如何在编码中处理这个问题?
我正在这样检查 Internet 连接。
public boolean isNetworkConnected() {
boolean connected = false;
ConnectivityManager connectivityManager;
connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
connected = networkInfo != null && networkInfo.isAvailable() &&
networkInfo.isConnected();
return connected;
}
从Activity开始,我就是这样做的。
if (isNetworkConnected()) {
// Connection Available
} else {
// No Connection
}
它应该在 else 部分出现,但它没有出现。
在清单中添加 ACCESS_NETWORK_STATE 权限。
要检测实际的互联网连接,您需要使用 Ping 进行测试,例如,此代码将 ping www.google.com 以检查连接,它与使用 ping 命令相关(因为它的可靠性),如果没有在发生错误时可用,它回退到 InetAddress isReachable 方法。
public boolean isConnected(){
try{
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
return returnVal==0;
} catch(Exception e){
//fallback to java's ICMP implementation
return InetAddress.getByName("8.8.8.8").isReachable(1000);
}
}
您可能需要对 URI 执行 openConnection()
。尝试在 runnable 中使用以下代码:
public boolean isHostReachable() {
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
try{
URI uri = new URI(YOUR_URL_HERE);
String domainName = uri.getScheme() + "://" + uri.getRawAuthority();
URL url = new URL(domainName);
URLConnection urlConn = url.openConnection();
urlConn.connect();
return true;
} catch (IOException | URISyntaxException e) {
return false;
}
您也可以使用 InetAddress 检查
public boolean isInternetAvailable() {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
//You can replace it with your name
return !ipAddr.equals("");
} catch (Exception e) {
return false;
}
}