我无法使用 DhcpInfo(已弃用),并且我尝试使用 InterfaceAddress.getNetworkPrefixLength。即使我传递 Inet4Address,getNetworkPrefixLength 也会返回 /64(这对于 IPv4 地址是不可能的)。 Android 文档指示我使用 LinkProperties,但我找不到任何文档。
编辑: 我不能依赖已root的手机
编辑#2:System.setProperty(“java.net.preferIPv4Stack”,“true”);根据 Dianne Hackborne
不起作用获取 Android 设备的 IP 地址、IP 网络掩码等的一种简单方法是使用 Android 终端模拟器。这是一个基于 Linux 的终端,如果你在那里输入:
ifconfig
ifconfig 是一个告诉您(Android 设备)接口规范的程序。
以下是有关 ifconfig 的一些信息:
http://linuxcommand.org/man_pages/ifconfig8.html
希望这有帮助!
这里有一些用于获取 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
}