我試圖定期檢查網絡連接。但是,這是針對中國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;
這沒什麼差別,彷彿預期。 – Armadillo
嗯。也許ConnectivityManager會幫助你:http://developer.android.com/intl/ru/reference/android/net/ConnectivityManager.html – Tishka17