获取物理地址的方法,支持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 Bluetooth 文件接收路径修改方法
  2. Android 获取手机的IMEI等设备信息
  3. Android中 Bitmap和Drawable相互转换的方法
  4. Android 处理 Button 单击事件的三种方法
  5. [Android Studio导入第三方类库方法] Error:(19, 23) 错误: 程序
  6. Android 中数据库查询方法query()中的selectionArgs的用法
  7. android客户端向服务器端验证登陆方法的实现2
  8. Unity-Android通信:AndroidJava 使用Unity c#编写Android程序调用
  9. Android stuio在MainActivity中运行java的main方法

随机推荐

  1. Android(安卓)Service中的startService或
  2. Android控件之TextView全解析
  3. Java游戏相关
  4. Android架构组件—ViewModel
  5. Android在智能终端领域的关键技术专题讲
  6. 处女男学Android(十二)---Android 菜单(Menu
  7. 关于android连续点击出现多个Activity界
  8. widget开发实例代码
  9. j2me与android的区别
  10. Android的View和ViewGroup深入分析