isReachable()在android中返回false

时间:2017-09-13 21:24:36

标签: java android mac-address hotspot

嗯,我有一种情况,当我的手机作为热点工作,我需要检测所有连接到我的手机的设备并找到他们的MAC地址。我写了这样的话:

public void getListOfConnectedDevice() {
    Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            BufferedReader br = null;
            boolean isFirstLine = true;

            try {
                br = new BufferedReader(new FileReader("/proc/net/arp"));
                String line;

                while ((line = br.readLine()) != null) {
                    if (isFirstLine) {
                        isFirstLine = false;
                        continue;
                    }

                    String[] splitted = line.split(" +");

                    if (splitted != null && splitted.length >= 4) {

                        String ipAddress = splitted[0];
                        String macAddress = splitted[3];

                       boolean isReachable = InetAddress.getByName(
                                splitted[0]).isReachable(300);// this is network call so we cant do that on UI thread, so i take background thread.
                        Log.d(TAG, "ip: " + splitted[0]);
                        Log.d(TAG, "isReachable: " + isReachable);
                        if (isReachable) {
                            Log.d("Device Information", ipAddress + " : "
                                    + macAddress);
                            macAddresses.add(macAddress); //My List<String>
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    thread.start();
}

但是boolean isReachable = InetAddress.getByName( splitted[0]).isReachable(300);仅在设备连接或断开连接时才返回false。我无法找到任何信息来找到解决方案。或者还有其他解决方案吗? (对于没有根电话)。

1 个答案:

答案 0 :(得分:0)

好吧,我发现android保持MAC设备的大约10分钟(在不同的设备 - 不同的时间),并且只有这样 - 使用ADB shell命令清除该列表,但是!它仅适用于root设备。

但是这段代码可以帮助你(不适用于所有设备):

public void getListOfConnectedDevice() {
    final Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            macAddresses.clear();
            BufferedReader br = null;
            boolean isFirstLine = true;
            try {

                br = new BufferedReader(new FileReader("/proc/net/arp"));
                String line;

                while ((line = br.readLine()) != null) {
                    if (isFirstLine) {
                        isFirstLine = false;
                        continue;
                    }

                    String[] splitted = line.split(" +");

                    if (splitted != null && splitted.length >= 4) {

                        String ipAddress = splitted[0];
                        String macAddress = splitted[3];

                        Node node = new Node(ipAddress, macAddress);
                        boolean isReachable = node.isReachable;
                        Log.d(TAG, "isReachable: " + isReachable);
                        if (isReachable) {
                            Log.d("Device Information", ipAddress + " : "
                                    + macAddress);
                            macAddresses.add(macAddress);
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    thread.start();
}