Я пытаюсь периодически проверять сетевое подключение. Однако это для китайского 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;
Это не делает никакой разницы, как и ожидалось, хотя. – Armadillo
Hm. Возможно, ConnectivityManager поможет вам: http://developer.android.com/intl/ru/reference/android/net/ConnectivityManager.html – Tishka17