Java isReachable()在android中返回false
嗯,当我的手机作为热点工作时,我需要检测所有连接到我手机的设备并找到它们的MAC地址。我写了这样的东西:Java isReachable()在android中返回false,java,android,mac-address,hotspot,Java,Android,Mac Address,Hotspot,嗯,当我的手机作为热点工作时,我需要检测所有连接到我手机的设备并找到它们的MAC地址。我写了这样的东西: public void getListOfConnectedDevice() { Thread thread = new Thread(new Runnable() { @Override public void run() { BufferedReader br = null; boolean isF
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();
}
public void getListOfConnectedDevice(){
Thread Thread=新线程(new Runnable(){
@凌驾
公开募捐{
BufferedReader br=null;
布尔值isFirstLine=true;
试一试{
br=新的BufferedReader(新的文件读取器(“/proc/net/arp”);
弦线;
而((line=br.readLine())!=null){
如果(第一行){
isFirstLine=false;
继续;
}
String[]splitted=line.split(“+”);
如果(拆分!=null&&splitted.length>=4){
字符串ipAddress=已拆分[0];
字符串macAddress=splitted[3];
布尔值isReachable=InetAddress.getByName(
已拆分[0]).isReachable(300);//这是网络调用,所以我们无法在UI线程上执行此操作,所以我使用后台线程。
Log.d(标签,“ip:+拆分的[0]);
Log.d(标签“isReachable:+isReachable”);
如果(isReachable){
Log.d(“设备信息”,ipAddress+”:“
+macAddress);
macAddress.add(macAddress);//我的列表
}
}
}
}捕获(例外e){
e、 printStackTrace();
}最后{
试一试{
br.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
});
thread.start();
}
但是boolean isReachable=InetAddress.getByName(
已拆分[0])。isReachable(300)代码>仅在设备连接或断开连接时返回false。我找不到任何信息来找到解决方案。或者还有其他解决办法吗?(适用于非根目录手机) 好吧,我发现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();
}