Android10以上 如何访问本地arp(语言-java)

Android10以上 如何实现无根用户访问ARP表?


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

getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array

在Android 10及以上的版本中,由于Android系统的安全性增强,应用程序不能直接读取ARP表。这是由于网络隐私和安全性因素所致。因此,应用程序不能直接使用ARP协议访问本地ARP表。

但是,可以使用Android系统提供的ConnectivityManager类中的API。可以使用getLinkProperties()方法获取与设备连接的所有网络的网络参数,包括ARP表。您可以使用getLinkAddresses()方法或getInterfaceAddresses()方法获取IP地址/子网掩码/广播地址/MTU等详细信息。然后,您可以使用NetworkUtils中的方法解析网络中设备的MAC地址。

以下是一个示例代码:

用java实现:

public static String getMacAddressFromArpCache(String ipAddress) {
    String macAddress = null;
    ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    Network network = connMgr.getActiveNetwork();
    LinkProperties linkProperties = connMgr.getLinkProperties(network);
    for (LinkAddress linkAddress : linkProperties.getLinkAddresses()) {
        InetAddress inetAddress = linkAddress.getAddress();
        if (inetAddress instanceof Inet4Address) {
            try {
                String ip = inetAddress.getHostAddress();
                if (ipAddress.equals(ip)) {
                    macAddress = NetworkUtils.resolveEthernetDevMac(ip);
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    return macAddress;
}

请注意,此类访问ARP缓存的方法可能会更改或停止工作,因为这些方法不属于公共API,而且可能随时受到Android系统更新的影响。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^