获取Android以太网MAC地址(非WiFi接口)

17

我使用的是API级别8的Android系统,想要获取以太网接口(eth0)的地址。

在API级别8上,NetworkInterface类没有getHardwareAddress()函数。WifiManager也不能用,因为这不是一个无线接口。

谢谢!

9个回答

28

这是基于 Joel F 回答的我的解决方案。希望能对某些人有所帮助!

/*
 * Load file content to String
 */
public static String loadFileAsString(String filePath) throws java.io.IOException{
    StringBuffer fileData = new StringBuffer(1000);
    BufferedReader reader = new BufferedReader(new FileReader(filePath));
    char[] buf = new char[1024];
    int numRead=0;
    while((numRead=reader.read(buf)) != -1){
        String readData = String.valueOf(buf, 0, numRead);
        fileData.append(readData);
    }
    reader.close();
    return fileData.toString();
}

/*
 * Get the STB MacAddress
 */
public String getMacAddress(){
    try {
        return loadFileAsString("/sys/class/net/eth0/address")
            .toUpperCase().substring(0, 17);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

24
假设您的以太网接口是eth0,则尝试打开并读取文件 /sys/class/net/eth0/address

太好了!它起作用了。你认为它能在任何带有eth0的Android设备上工作吗? - inversus
它应该是标准的Linux内核路径,我怀疑他们不会很快更改。很高兴能帮到你。 - Joel F

3
public static String getEthernetMacAddress() {
    String macAddress = "Not able to read";
    try {
        List<NetworkInterface> allNetworkInterfaces = Collections.list(NetworkInterface
                .getNetworkInterfaces());
        for (NetworkInterface nif : allNetworkInterfaces) {
            if (!nif.getName().equalsIgnoreCase("eth0")) 
                continue;

            byte[] macBytes = nif.getHardwareAddress();
            if (macBytes == null) {
                return macAddress;
            }

            StringBuilder res1 = new StringBuilder();
            for (byte b : macBytes) {
                res1.append(String.format("%02X:", b));
            }

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            macAddress = res1.toString();
        }
    } catch (Exception ex) {
        log(LogLevel.ERROR, "getEthernetMacAddress e :" + ex.getMessage());
        ex.printStackTrace();
    }
    return macAddress;
}

这个解决方案可行,不需要任何读取权限。谢谢! - alizeyn

2
使用以下方法修复Java问题,可能会对您有所帮助:

这样的用法

NetworkInterface netf = NetworkInterface.getByName("eth0");
byte[] array = netf.getHardwareAddress();
StringBuilder stringBuilder = new StringBuilder("");
String str = "";
for (int i = 0; i < array.length; i++) {
    int v = array[i] & 0xFF;
    String hv = Integer.toHexString(v).toUpperCase();
    if (hv.length() < 2) {
        stringBuilder.append(0);
    }
    stringBuilder.append(hv).append("-");                   
}
str = stringBuilder.substring(0, stringBuilder.length()- 1);

1

在Amlogic平台上,至少还要检查/sys/class/efuse/mac。


1
也许我的答案对你们中的一些人有用,对其他人来说至少很有趣。我试图获取Android TV设备的以太网MAC地址,以尝试找到MAC地址注册的实际制造商。我使用adb连接到设备,并使用Joel F上面的好答案,效果很好。然后我把盒子翻过来,在设备底部的贴纸上找到了它。所以,如果您不需要编程,先尝试翻转设备。MAC address sticker on bottom of device. P.S. 我联系了注册地址的制造商,他们说他们没有制造这个型号,其他制造商复制了他们的MAC地址。

0

'a.prateek' solution 的 Kotlin 版本:

fun getEthernetMacAddress(): String? {
    try {
        val allNetworkInterfaces: List<NetworkInterface> = Collections.list(NetworkInterface.getNetworkInterfaces())
        for (networkInterface in allNetworkInterfaces) {
            if (!networkInterface.name.contains("eth0", ignoreCase = true)) continue
            val macBytes = networkInterface.hardwareAddress ?: continue
            val macStringBuilder = StringBuilder()
            for (byte in macBytes) {
                macStringBuilder.append(String.format("%02X:", byte))
            }
            if (macStringBuilder.isNotEmpty()) {
                macStringBuilder.deleteCharAt(macStringBuilder.length - 1)
            }
            return macStringBuilder.toString()
        }
    } catch (e: Exception) {
        Timber.e(e)
    }
    return null
}

0

现在(2014年3月),Google还没有提供关于以太网的API。

这就是我们无法像WiFi情况下那样获取以太网MAC地址的原因。

private String getWifiMACAddress(Context ctx) {
    WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
    WifiInfo info = wifiManager.getConnectionInfo();
   return info.getMacAddress();
}

一个替代方案是读取eth0文件。如果有人知道其他方法,请告诉我!


0

许多AndroidTV的实现可能已经在属性中填充了它,您可以使用getprop命令检查以找到正确的属性名称,然后使用SystemProperties.get()读取它。

要在Java程序中读取MAC地址,您可以使用以下类似的代码:

SystemProperties.get("ro.boot.ethernet-mac");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接