2013-08-22 40 views
4

我试图定期检查网络连接。但是,这是针对中国Android Mini PC的,而不是平板电脑或智能手机。我正在使用以太网到USB适配器而不是Wi-Fi。首先,我使用了广播接收器类:定期检查以太网连接android

public class NetworkStateReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getExtras() != null) { 
      @SuppressWarnings("deprecation") 
      NetworkInfo eni = (NetworkInfo) intent.getExtras().get(
        ConnectivityManager.EXTRA_NETWORK_INFO); 

      if (eni != null && eni.getState() == NetworkInfo.State.CONNECTED) { 
       Log.d(TAG, "Network " + eni.getTypeName() + " connected."); 
      } 
     } 
     if (intent.getExtras().getBoolean(
       ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { 
      Log.d(TAG, "There's no network connectivity."); 
     } 
    } 
} 

这对于Wi-Fi和移动设备来说是完美的。但是,对于以太网而言,存在复杂性。当我将以太网连接到USB适配器时,它认为它已经有有以太网连接,以太网电缆是否连接。只有在移除适配器时,它才知道以​​太网连接已被移除。

我试图用一个插座,而这种作品:

private static boolean checkSocket(String host, int port) { 
     Socket socket = null; 
     boolean reachable = false; 
     try { 
      socket = new Socket(InetAddress.getByName(host), port); 
      reachable = true; 
     } catch (UnknownHostException e) { 
     } catch (IOException e) { 
     } finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
       } 
      } 
     } 
     return reachable; 
    } 

当有一个连接,它完美而快速。当连接丢失时,程序知道它已经过了很长时间。我需要这个解决方案,但它应该知道方式更快以太网连接已经丢失。另外,这依赖于Exceptions,我根本不喜欢它。

最后我想简单的ICMP消息:

try { 
     InetAddress address = InetAddress.getByName(host); 
     if (address.isReachable(timeout)) { 
      return true; 
     } 
    } catch (UnknownHostException e) { 
    } catch (IOException e) { 
    } 
    return false; 

应该工作,对不对?不幸的是,事实并非如此。到现在为止,执行此代码时我总是收到一个false

我在做什么错,什么是正确的方法来做到这一点?

编辑1

现在我已经尝试了这个解决方案,其工作和不工作。这很有趣和烦人,因为我在onResume()中检查了这个。经过几次正确的尝试后,它突然停止。但我不知道为什么。

boolean reachable = false; 
    try { 
     Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 " + host); 
     int retValue = p1.waitFor(); 
     reachable = (retValue == 0); 
     Log.d(TAG, String.valueOf(reachable)); 
     p1.destroy(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    return reachable; 

回答

0

尝试连接到ip ADDRES,你做

ADD不解析DNS: 尝试使用ConnectivityManager.getActiveNetworkInfo然后

((ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo().isConnected() 
+0

这没什么差别,仿佛预期。 – Armadillo

+0

嗯。也许ConnectivityManager会帮助你:http://developer.android.com/intl/ru/reference/android/net/ConnectivityManager.html – Tishka17