获取物理地址的方法,支持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_FOUNDBluetoothLeScanner.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 地址。此方法对于跟踪设备队列非常有用。

更多相关文章

  1. Android学习视频
  2. android download file and save to sdCard
  3. Android(安卓)获取手机的IMEI等设备信息
  4. Android(安卓)终端上的开发工具
  5. Android(安卓)Bluetooth 文件接收路径修改方法
  6. Android中 Bitmap和Drawable相互转换的方法
  7. Android获取声音长度
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. android中activity的四种加载模式
  2. android的ORMLite的sqlite自定义框架
  3. Android(安卓)UI开发第一篇――android的
  4. Android(安卓)Junit Test
  5. 基于 Android(安卓)NDK 的学习之旅-----
  6. 转:Android(安卓)AsyncTask
  7. Android系统中设置TextView的行间距(非行
  8. Android(安卓)所有版本区别总结
  9. android知识链接汇总(3)
  10. Android系统编译环境变量的设置