非Google Play发布的Android Pie+设备获取真实蓝牙MAC地址方法咨询
解答:Android Pie+ 设备获取真实蓝牙MAC地址的问题
核心背景
从 Android 9(Pie)开始,Google 引入了隐私保护限制,普通权限的应用无法直接获取真实的蓝牙MAC地址:
BluetoothAdapter.getAddress()会返回固定的虚假地址(如02:00:00:00:00:00)- 通过
Settings.Secure.getString(..., "bluetooth_address")会返回null
权限相关说明
你目前仅申请了 ACCESS_FINE_LOCATION 运行时权限,但在 Pie+ 版本中,这个权限已经不足以获取真实蓝牙MAC。之前在 Oreo 及以下生效的权限有特殊限制:
LOCAL_MAC_ADDRESS和READ_PRIVILEGED_PHONE_STATE属于系统级特权权限,普通应用(即使是个人测试)如果没有系统签名或者设备Root权限,无法通过常规方式申请并使用这些权限。BLUETOOTH和BLUETOOTH_ADMIN权限在 Pie+ 仍需声明,但仅能用于蓝牙功能操作,无法获取MAC地址。
Pie/Android 10 设备获取真实蓝牙MAC的可行方案(仅用于个人测试)
因为你明确是个人设备测试,不考虑Google Play上架,以下几种方式可行:
1. 设备Root后读取系统文件
Root后的设备可以直接读取蓝牙MAC地址的系统存储文件,代码示例:
public String getRealBluetoothMac() { try { File file = new File("/sys/class/bluetooth/hci0/address"); if (file.exists()) { BufferedReader br = new BufferedReader(new FileReader(file)); String mac = br.readLine().trim(); br.close(); return mac; } } catch (IOException e) { e.printStackTrace(); } return null; }
注意:不同设备的蓝牙接口可能不是 hci0,如果读取失败,可以尝试 hci1 等其他编号。
2. 作为系统应用(需系统签名)
如果你的应用能获得设备厂商的系统签名,成为系统应用后,之前在Oreo及以下使用的方法(Settings.Secure.getString(..., "bluetooth_address") 或 BluetoothAdapter.getAddress())会恢复生效,同时需要声明 LOCAL_MAC_ADDRESS 和 READ_PRIVILEGED_PHONE_STATE 权限。
3. 通过ADB命令获取(非代码方式)
如果只是个人测试,也可以直接通过ADB命令查看真实蓝牙MAC:
adb shell cat /sys/class/bluetooth/hci0/address
总结:普通无Root/无系统签名的应用在Pie+上无法获取真实蓝牙MAC,只有通过Root或系统应用的方式才能实现你的需求。
内容的提问来源于stack exchange,提问作者Mena
相关产品推荐
相关产品推荐

