Android 12本地仅用热点下如何获取连接设备的IP、主机名等信息?
Android 12 本地仅用热点连接设备信息获取方案
针对Android 12中用于车载投影的本地仅用热点(LocalOnlyHotspot),由于系统默认不会将连接设备的IP、主机名、MAC地址同步给第三方应用,常规的WifiManager、TetheringManager无法获取这些数据,以下是可行的实现思路:
1. 读取系统DHCP租约文件(需ROOT权限)
本地仅用热点的DHCP服务由dnsmasq维护,所有连接设备的租约信息会存在/data/misc/dnsmasq/dnsmasq.leases文件里,每行格式为:[租期时间] [MAC地址] [IP地址] [主机名] [客户端ID]。
- 操作步骤:
- 获取ROOT权限后,直接读取该文件内容
- 按行拆分字段,提取所需的MAC、IP和主机名
- 代码示例:
try { Process process = Runtime.getRuntime().exec("cat /data/misc/dnsmasq/dnsmasq.leases"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { String[] entries = line.split("\\s+"); if (entries.length >= 4) { String macAddr = entries[1]; String ipAddr = entries[2]; String hostname = entries[3]; // 处理获取到的设备信息 } } reader.close(); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); }
2. 解析ARP缓存表(无需ROOT,无主机名)
ARP缓存表记录了局域网内IP与MAC的映射,存储在/proc/net/arp文件中,Android 12允许普通应用读取该文件(需申请ACCESS_NETWORK_STATE权限)。
- 操作步骤:
- 先通过
ConnectivityManager监听网络状态,定位到本地仅用热点对应的子网(默认多为192.168.43.0/24) - 读取
/proc/net/arp,过滤出该子网内的有效条目(状态为0x2表示已连接) - 主机名需额外通过MDNS查询或反向DNS解析获取
- 先通过
- 代码示例:
try { BufferedReader reader = new BufferedReader(new FileReader("/proc/net/arp")); String header = reader.readLine(); // 跳过表头行 String line; while ((line = reader.readLine()) != null) { String[] parts = line.split("\\s+"); String ip = parts[0]; String mac = parts[3]; String status = parts[5]; // 筛选已连接且属于热点子网的设备 if ("0x2".equals(status) && ip.startsWith("192.168.43.")) { // 处理IP和MAC,后续补充主机名 } } reader.close(); } catch (IOException e) { e.printStackTrace(); }
3. 主动扫描局域网设备(无需ROOT,效率一般)
通过扫描热点子网内的所有IP,结合ping判断设备存活,再用MDNS查询获取主机名,ARP获取MAC。
- 操作步骤:
- 通过
LocalOnlyHotspotReservation.getWifiConfiguration()获取热点网关,推导子网范围(比如网关为192.168.43.1,则子网为192.168.43.2~192.168.43.254) - 遍历子网IP,执行
ping -c 1 [ip]判断设备是否存活 - 对存活IP,用
NsdManager发送MDNS查询获取主机名
- 通过
- 注意:需要申请
INTERNET和ACCESS_NETWORK_STATE权限,部分设备可能限制ICMP ping请求。
权限总结
- ROOT权限:仅方案1需要,用于访问系统私有目录
- 普通权限:
ACCESS_NETWORK_STATE、INTERNET,部分设备扫描局域网需ACCESS_FINE_LOCATION权限
内容的提问来源于stack exchange,提问作者pravin kumar
相关产品推荐
相关产品推荐

