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

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

public String getMacAddress() {
    List 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";
}

该方法需要请求网络权限:



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 地址。此方法对于跟踪设备队列非常有用。

你可能感兴趣的:(Android)