Android arp表 – 开发问题

我正在编写的Android应用程序有两个问题。

我正在从/proc/net/arp读出本地arp表,并在哈希映射中保存ip和相应的mac地址。 看我的function。 它运作正常。

  /** * Extract and save ip and corresponding MAC address from arp table in HashMap */ public Map createArpMap() throws IOException { checkMapARP.clear(); BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp"))); String line = ""; while ((line = localBufferdReader.readLine()) != null) { String[] ipmac = line.split("[ ]+"); if (!ipmac[0].matches("IP")) { String ip = ipmac[0]; String mac = ipmac[3]; if (!checkMapARP.containsKey(ip)) { checkMapARP.put(ip, mac); } } } return Collections.unmodifiableMap(checkMapARP); } 
  1. 第一个问题:

    我也在使用广播接收器。 当我的应用程序收到状态WifiManager.NETWORK_STATE_CHANGED_ACTION我检查是否建立了与网关的连接。 如果为true,我调用我的函数来读取arp表。 但是在这个阶段,系统还没有构建arp表。 有时,当我收到连接状态时,arp表是空的。

    有人有想法解决这个问题吗?

  2. 第二个问题:

    我想以持久的方式保存网关的ip和mac地址。 现在我正在使用共享首选项 。 也许写入内部存储更好?

    有小费吗?

对于第一个问题,您可以在睡眠一段时间之后启动一个运行该方法的新线程,或者直到它有一些条目(使用邮箱创建Runnable以获取Map) – 除非您需要直接使用地图,那么我认为唯一的方法是等待参赛作品。 例如(如果您需要直接使用地图):

 public Map createArpMap() throws IOException { checkMapARP.clear(); BufferedReader localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp"))); String line = ""; while ((line = localBufferdReader.readLine()) == null) { localBufferdReader.close(); Thread.sleep(1000); localBufferdReader = new BufferedReader(new FileReader(new File("/proc/net/arp"))); } do { String[] ipmac = line.split("[ ]+"); if (!ipmac[0].matches("IP")) { String ip = ipmac[0]; String mac = ipmac[3]; if (!checkMapARP.containsKey(ip)) { checkMapARP.put(ip, mac); } } } while ((line = localBufferdReader.readLine()) != null); return Collections.unmodifiableMap(checkMapARP); }