处理互联网连接:特例

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;
    }
}