lom_fd 2023-04-04 14:50 采纳率: 0%
浏览 72

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

  • 写回答

2条回答 默认 最新

  • Java技术汇 2023-04-04 14:59
    关注

    在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系统更新的影响。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月4日