isReachable() returns 在 android 中为假
isReachable() returns false in android
好吧,我的 phone 正在作为热点工作,我需要检测所有连接到我的 phone 的设备并找到它们的 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);
returns 只有在设备连接或断开连接时才为假。而且我找不到任何信息来找到解决方案。或者还有其他解决方案吗? (对于未植根的 phones)。
好吧,我发现 android 保留 MAC 设备地址大约 10 分钟(在不同的设备上 - 不同的时间),唯一的方法 - 使用 ADB shell 命令来清除该列表,但是!它仅适用于有根设备。
但此代码可以帮助您(并非适用于所有设备):
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();
}
好吧,我的 phone 正在作为热点工作,我需要检测所有连接到我的 phone 的设备并找到它们的 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);
returns 只有在设备连接或断开连接时才为假。而且我找不到任何信息来找到解决方案。或者还有其他解决方案吗? (对于未植根的 phones)。
好吧,我发现 android 保留 MAC 设备地址大约 10 分钟(在不同的设备上 - 不同的时间),唯一的方法 - 使用 ADB shell 命令来清除该列表,但是!它仅适用于有根设备。
但此代码可以帮助您(并非适用于所有设备):
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();
}