我正在尝试定期检查网络连接。但是,这适用于中国Android Mini PC,而不是平板电脑或智能手机。我正在使用以太网到usb适配器而不是Wi-Fi。首先我使用了广播接收器类:
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 :(得分:0)
尝试连接到ip地址,而不是像你一样解析dns
ADD: 尝试使用ConnectivityManager.getActiveNetworkInfo然后
((ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo().isConnected()