Android獲取物理地址(支持5.0~10.0)

獲取物理地址的方法,支持Android 5.0~Android 10.0

public String getMacAddress() {
    List<NetworkInterface> interfaces = null;
    try {
        interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface networkInterface : interfaces) {
            if (networkInterface != null && TextUtils.isEmpty(networkInterface.getName()) == false) {
                if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
                    byte[] macBytes = networkInterface.getHardwareAddress();
                    if (macBytes != null && macBytes.length > 0) {
                        StringBuilder str = new StringBuilder();
                        for (byte b : macBytes) {
                            str.append(String.format("%02X:", b));
                        }
                        if (str.length() > 0) {
                            str.deleteCharAt(str.length() - 1);
                        }
                        return str.toString();
                    }
                }
            }
        }
    } catch (SocketException e) {
        e.printStackTrace();
    }
    return "unknown";
}

該方法需要請求網絡權限:

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

Android 6.0之前獲取物理地址的方法

public String getMacAddress(Context context) {
    if (context != null) {
        try {
            WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            if (wifi != null) {
                WifiInfo info = wifi.getConnectionInfo();
                if (info != null) {
                    return info.getMacAddress();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return "unknown";
}

Android 6.0 開始,使用上述方法返回值總是 02:00:00:00:00:00。

Android 6.0 變更

爲給用戶提供更嚴格的數據保護,從此版本開始,對於使用 WLAN API 和 Bluetooth API 的應用,Android 移除了對設備本地硬件標識符的編程訪問權。WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法現在會返回常量值 02:00:00:00:00:00。
現在,要通過藍牙和 WLAN 掃描訪問附近外部設備的硬件標識符,您的應用必須擁有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 權限。

WifiManager.getScanResults() 
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()

Android 7.0 提供 DevicePolicyManager.getWifiMacAddress

Android 7.0 行爲變更

設備所有者可以訪問設備標識符。設備所有者可以使用 DevicePolicyManagewr.getWifiMacAddress()
訪問設備的 WLAN MAC 地址。如果設備上從未啓用 WLAN,則此方法將返回一個 null 值。

通過上述方法獲取MAC地址需要申請設備管理者權限,如果應用本身用不到該權限,不推薦使用。

獲取設備管理者權限的方法可參照下述鏈接:

設備管理


Android 10.0 隨機分配 MAC 地址

Android 10 中的隱私權變更

默認情況下,在搭載 Android 10 或更高版本的設備上,系統會傳輸隨機分配的 MAC 地址。

如果您的應用處理企業使用場景,平臺會提供 API,用於執行與 MAC 地址相關的幾個操作。

獲取隨機分配的 MAC 地址:設備所有者應用和資料所有者應用可以通過調用 getRandomizedMacAddress()
檢索分配給特定網絡的隨機分配 MAC 地址。 獲取實際的出廠 MAC 地址:設備所有者應用可以通過調用
getWifiMacAddress() 檢索設備的實際硬件 MAC 地址。此方法對於跟蹤設備隊列非常有用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章