web-dev-qa-db-ja.com

Get AndroidイーサネットMACアドレス(wifiインターフェースではありません)

AndroidをApiレベル8で使用していて、イーサネットインターフェイスのアドレス(eth0)を取得したい。

APIレベル8では、NetworkInterfaceクラスに関数getHardwareAddress()がありません。これはワイヤレスインターフェイスではないため、WifiManagerも機能しません。

前もって感謝します!

15
inversus

イーサネットインターフェイスがeth0であると仮定して、ファイルを開いて読み取ってみてください/sys/class/net/eth0/address

21
Joel F

これは、ジョエル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;
    }
}
26
inversus

この使用方法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);
2
聂培申

少なくともアムロジックプラットフォームでは、/ sys/class/efuse/macも確認してください。

1

現在(2014年3月)Googleは イーサネット に関するAPIを提供していません

これは、wifiの場合のようにイーサネットマックを入手する方法がないため、理由です。

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

1つの代替方法は、eth0ファイルを読み取ることです。誰かが他のことを知っているなら私に知らせてください!

0
Musculaa

たぶん私の答えはそこにいるあなたの何人かにとって役立つでしょう、そして少なくともあなたの残りのために面白いでしょう。

Android TVデバイスのイーサネットMACアドレスを取得しようとして、MACアドレスが登録されている実際のメーカーを見つけようとしました。adbでデバイスに接続し、JoelFのすばらしいものを使用しました。上記の答えとそれはうまくいきました。

それから私は箱をひっくり返しました、そしてそこでそれは装置の底のステッカーにあります。

したがって、プログラムで必要ない場合は、最初にデバイスを裏返してみてください。 MAC address sticker on bottom of device.

P.S.アドレスが登録されているメーカーに連絡したところ、このモデルは製造しておらず、他のメーカーがMACアドレスをコピーしているとのことでした。

0
Shane E.
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;
}
0
a.prateek