Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 定期检查以太网连接_Android_Android Networking_Icmp_Network Connection - Fatal编程技术网

Android 定期检查以太网连接

Android 定期检查以太网连接,android,android-networking,icmp,network-connection,Android,Android Networking,Icmp,Network Connection,我正在尝试定期检查网络连接。不过,这是针对中国安卓迷你PC的,而不是平板电脑或智能手机。我正在使用以太网到usb适配器,而不是Wi-Fi。首先,我使用了broadcastreceiver类: public class NetworkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (inten

我正在尝试定期检查网络连接。不过,这是针对中国安卓迷你PC的,而不是平板电脑或智能手机。我正在使用以太网到usb适配器,而不是Wi-Fi。首先,我使用了broadcastreceiver类:

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;
    }
当有一个连接时,它可以完美而快速地工作。当连接断开时,程序需要很长时间才能知道它已经断开了。我需要这个解决方案,但它应该更快地知道以太网连接已丢失。而且,这依赖于例外,我一点也不喜欢例外

最后,我尝试了一个简单的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;

尝试连接到ip地址,而不是像您那样解析dns

加: 那就试试吧


不过,正如所料,这没有什么区别。也许ConnectivityManager将帮助您:
((ConnectivityManager) Context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo().isConnected()