如何在没有 root 的情况下在 Android 中获取 IPv4 子网前缀/掩码?

问题描述 投票:0回答:2

我无法使用 DhcpInfo(已弃用),并且我尝试使用 InterfaceAddress.getNetworkPrefixLength。即使我传递 Inet4Address,getNetworkPrefixLength 也会返回 /64(这对于 IPv4 地址是不可能的)。 Android 文档指示我使用 LinkProperties,但我找不到任何文档。

编辑: 我不能依赖已root的手机

编辑#2:System.setProperty(“java.net.preferIPv4Stack”,“true”);根据 Dianne Hackborne

不起作用
java android networking subnet
2个回答
0
投票

获取 Android 设备的 IP 地址、IP 网络掩码等的一种简单方法是使用 Android 终端模拟器。这是一个基于 Linux 的终端,如果你在那里输入:

ifconfig

ifconfig 是一个告诉您(Android 设备)接口规范的程序。

以下是有关 ifconfig 的一些信息:

http://linuxcommand.org/man_pages/ifconfig8.html

希望这有帮助!


0
投票

这里有一些用于获取 ipv4 地址及其掩码的 Kotlin 代码。诀窍是,如果将 InterfaceAddress 转换为字符串,您将得到一个包含 IP 地址、掩码和 IP 广播地址的字符串。然后,您使用正则表达式从该字符串中提取 IP 和掩码。 IPv4 地址的 InterfaceAddress 内部包含掩码,但不直接公开它。因此,这是一种无需使用反射即可获得遮罩的技术。显然,如果 InterfaceAddress.toString() 在未来的某个版本中发生更改,则不能保证此代码不会中断。

 var ifAddr: InterfaceAddress? = getInterfaceAddress()
 println ("ip: " + getIPAddr(ifAddr!!) + " mask: " + getIPMask(ifAddr))



fun getInterfaceAddress(): InterfaceAddress?
{
    try
    {
         //Enumerate all the network interfaces
        var en:Enumeration<NetworkInterface> = NetworkInterface.getNetworkInterfaces()
        while(en.hasMoreElements()) {
            var intf: NetworkInterface = en.nextElement();
            // Make a loop on the number of IP addresses related to each Network Interface
            var interfaceAddresses: MutableList<InterfaceAddress> = intf.interfaceAddresses
            for (i in 0 until interfaceAddresses.size) {
                var ifAddr = interfaceAddresses.get(i)
                if (ifAddr.toString().indexOf((":")) < 0) {
                    println(ifAddr)
                    if (!ifAddr.address.isLoopbackAddress)
                        return ifAddr
                }

            }

        }
    } catch (e: SocketException)
    {
        e.printStackTrace();
    }
    return null;
}

fun getIPAddr(ifAddr: InterfaceAddress): String {
    var pattern = Regex("/([0-9,.]*)/")
    val result = pattern.find(ifAddr.toString())
    if (result != null) {
        var g = result.groupValues
        if (g.size > 1) return g.get(1)
    }
    return ""
}

fun getIPMask(ifAddr: InterfaceAddress): Int {
    var pattern = Regex(".*/([0-9]*)\\s")
    val result = pattern.find(ifAddr.toString())
    if (result != null) {
        var g = result.groupValues
        if (g.size > 1) return g.get(1).toInt()
    }
    return 0
}
© www.soinside.com 2019 - 2024. All rights reserved.