2013-08-22 5 views
4

Я пытаюсь периодически проверять сетевое подключение. Однако это для китайского Android Mini PC, а не для планшета или смартфона. Я использую сетевой адаптер для usb-адаптера вместо Wi-Fi. Сначала я использовал класс вещательного вещателя:проверить соединение ethernet периодически андроид

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 и мобильных устройств. Однако для ethernet возникают осложнения. Когда я подключаю сетевой адаптер к USB-адаптеру, он считает, что уже имеет, имеет соединение ETHERNET, подключен ли кабель Ethernet или нет.. Только при извлечении адаптера он знает, что соединение Ethernet было удалено.

Я попытался использовать сокет, и этот вид работ:

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

Когда есть связь, это работает отлично и быстро. Когда соединение потеряно, оно слишком длительное, чтобы программа могла это знать. Мне нужно это решение, но он должен знать быстрее, что Ethernet-соединение потеряно. Кроме того, это зависит от Исключений, которые я вообще не люблю.

Наконец я попытался простой ICMP сообщение:

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

Этот должен работу, не так ли? К сожалению, нет. До сих пор я всегда получал false при выполнении этого кода.

Что я делаю неправильно и как правильно это сделать?

EDIT 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

Попробуйте подключиться к внутрибрюшинно Адресная, не разрешения DNS, как вы делаете

ADD: Попробуйте использовать ConnectivityManager.getActiveNetworkInfo затем

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

Это не делает никакой разницы, как и ожидалось, хотя. – Armadillo

+0

Hm. Возможно, ConnectivityManager поможет вам: http://developer.android.com/intl/ru/reference/android/net/ConnectivityManager.html – Tishka17