web-dev-qa-db-ja.com

Android Marshmallow以降で不足しているWifi MACアドレスを取得する方法は?

Android MでWifi MACアドレスを取得しようとしているAndroid開発者は、標準のAndroid MACアドレスを取得するOS APIが偽のMACを返すという問題を経験した可能性があります実際の値の代わりにアドレス(02:00:00:00:00:00)。

Wifi MACアドレスを取得する通常の方法は次のとおりです。

final WifiManager wifiManager = (WifiManager) getApplication().getApplicationContext().getSystemService(Context.WIFI_SERVICE);

final String wifiMACaddress = wifiManager.getConnectionInfo().getMacAddress();
15
DanielG

Android Mでは、MACアドレスはWiFiおよびBluetoothに対して「読み取り不可能」になります。WiFiMACアドレスは(Android Mプレビュー2)で取得できます。

public static String getWifiMacAddress() {
    try {
        String interfaceName = "wlan0";
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface intf : interfaces) {
            if (!intf.getName().equalsIgnoreCase(interfaceName)){
                continue;
            }

            byte[] mac = intf.getHardwareAddress();
            if (mac==null){
                return "";
            }

            StringBuilder buf = new StringBuilder();
            for (byte aMac : mac) {
                buf.append(String.format("%02X:", aMac));
            }
            if (buf.length()>0) {
                buf.deleteCharAt(buf.length() - 1);
            }
            return buf.toString();
        }
    } catch (Exception ex) { } // for now eat exceptions
    return "";
}

(これからこのコードを取得 Post

"/ sys/class/net /" + networkInterfaceName + "/ address"からファイルを読み取ると聞きました。 Android Nがリリースされるため、動作しません。また、Samsungなどの異なるメーカー間で差異が生じる可能性があります。

うまくいけば、このコードは後のバージョンでも引き続き機能しますAndroidバージョン。

編集:Android 6リリースでもこれは動作します

29
Informatic0re

解決しました!

MACアドレスは引き続きパスから取得できます。

"/sys/class/net/" + networkInterfaceName + "/address";

単にファイルの読み取りを行うか、そのファイルの猫がWifi MACアドレスを表示します。

ネットワークインターフェイス名は通常、「wlan0」または「eth1」の行に沿っています

7
DanielG

MACアドレスはIPv6ローカルアドレスから取得できます。たとえば、IPv6アドレス「fe80 :: 1034:56ff:fe78:9abc」は、MACアドレス「12-34-56-78-9a-bc」に対応します。以下のコードを参照してください。 WiFi IPv6アドレスを取得するには、Android.permission.INTERNETのみが必要です。

Wikipediaのページ IPv6 Address を参照してください。特に、「ローカルアドレス」fe80 ::/64に関する注記と「Modified EUI-64」に関するセクションをご覧ください。

/**
 * Gets an EUI-48 MAC address from an IPv6 link-local address.
 * E.g., the IPv6 address "fe80::1034:56ff:fe78:9abc"
 * corresponds to the MAC address "12-34-56-78-9a-bc".
 * <p/>
 * See the note about "local addresses" fe80::/64 and the section about "Modified EUI-64" in
 * the Wikipedia article "IPv6 address" at https://en.wikipedia.org/wiki/IPv6_address
 *
 * @param ipv6 An Inet6Address object.
 * @return The EUI-48 MAC address as a byte array, null on error.
 */
private static byte[] getMacAddressFromIpv6(final Inet6Address ipv6)
{
    byte[] eui48mac = null;

    if (ipv6 != null) {
        /*
         * Make sure that this is an fe80::/64 link-local address.
         */
        final byte[] ipv6Bytes = ipv6.getAddress();
        if ((ipv6Bytes != null) &&
                (ipv6Bytes.length == 16) &&
                (ipv6Bytes[0] == (byte) 0xfe) &&
                (ipv6Bytes[1] == (byte) 0x80) &&
                (ipv6Bytes[11] == (byte) 0xff) &&
                (ipv6Bytes[12] == (byte) 0xfe)) {
            /*
             * Allocate a byte array for storing the EUI-48 MAC address, then fill it
             * from the appropriate bytes of the IPv6 address. Invert the 7th bit
             * of the first byte and discard the "ff:fe" portion of the modified
             * EUI-64 MAC address.
             */
            eui48mac = new byte[6];
            eui48mac[0] = (byte) (ipv6Bytes[8] ^ 0x2);
            eui48mac[1] = ipv6Bytes[9];
            eui48mac[2] = ipv6Bytes[10];
            eui48mac[3] = ipv6Bytes[13];
            eui48mac[4] = ipv6Bytes[14];
            eui48mac[5] = ipv6Bytes[15];
        }
    }

    return eui48mac;
}
2
Yojimbo