57

プログラムで Android デバイスの Mac Id を取得するにはどうすればよいですか。私は IMIE コードを使用しており、デバイスの Mac ID を手動で確認する方法は知っていますが、プログラムで確認する方法はわかりません。

4

8 に答える 8

131
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wInfo = wifiManager.getConnectionInfo();
String macAddress = wInfo.getMacAddress(); 

また、マニフェスト ファイルに以下のアクセス許可を追加します。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Android 6.0 の変更点を参照してください。

ユーザーにより優れたデータ保護を提供するために、このリリース以降、Android は、Wi-Fi および Bluetooth API を使用するアプリのデバイスのローカル ハードウェア識別子へのプログラムによるアクセスを削除します。WifiInfo.getMacAddress() および BluetoothAdapter.getAddress() メソッドは、02:00:00:00:00:00 の定数値を返すようになりました。

Bluetooth および Wi-Fi スキャンを介して近くの外部デバイスのハードウェア識別子にアクセスするには、アプリに ACCESS_FINE_LOCATION または ACCESS_COARSE_LOCATION 権限が必要です。

于 2012-05-31T10:16:32.750 に答える
21

純粋な Java 実装を提供し、WifiManager なしで動作する Utils.java の例を提出したこの投稿を参照してください。一部の Android デバイスでは、Wi-Fi が利用できないか、イーサネット配線を使用している可能性があります。

Utils.getMACAddress("wlan0");
Utils.getMACAddress("eth0");
Utils.getIPAddress(true); // IPv4
Utils.getIPAddress(false); // IPv6 
于 2012-10-22T08:22:29.993 に答える
11

このコードを使用すると、 Android 6.0 でもMacAddress を取得できます。

public static String getMacAddr() {
    try {
        List <NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface nif: all) {
            if (!nif.getName().equalsIgnoreCase("wlan0")) continue;

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

            StringBuilder res1 = new StringBuilder();
            for (byte b: macBytes) {
                //res1.append(Integer.toHexString(b & 0xFF) + ":");
                res1.append(String.format("%02X:", b));
            }

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {}
    return "02:00:00:00:00:00";
}

EDIT 1. この回答には、16進形式の1桁のバイトがその前に「0」が付いていないというバグがありました。res1 への追加は、それを処理するように変更されました。

于 2017-05-06T13:22:31.780 に答える