Flutter Dart中如何获取设备真实MAC地址?已尝试多包无效
解决获取设备MAC地址返回
02:00:00:00:00:00的问题 原因分析
- Android 6.0(API Level 23)及以上版本,系统为隐私保护限制了APP获取真实WiFi MAC地址的权限,默认返回
02:00:00:00:00:00作为占位符。 - iOS从iOS 7开始,同样禁止APP直接获取设备真实MAC地址,会返回固定虚拟地址。
- 你尝试的第三方包本质都是调用系统API,受限于系统权限限制,自然无法返回真实MAC。
可行解决方案
1. Android平台特殊场景处理
如果你的APP是系统级应用或持有特殊权限,可尝试读取系统文件获取:
import 'dart:io'; Future<String?> getAndroidMac() async { try { final macFile = File('/sys/class/net/wlan0/address'); if (await macFile.exists()) { return (await macFile.readAsString()).trim(); } } catch (e) { print('读取MAC失败: $e'); } return null; }
注意:Android 10及以上版本,普通第三方APP即便申请权限也无法读取该文件,仅系统签名应用可访问。
2. 跨平台替代方案(推荐)
既然无法获取真实MAC,建议用以下标识替代设备唯一识别:
- Android ID:通过
android_id包获取,设备重置前保持唯一。 - 本地存储UUID:首次启动生成唯一UUID,存入SharedPreferences,后续复用作为设备标识。
- IMEI(仅Android):需申请
READ_PHONE_STATE权限,Android 10及以上需特殊权限才能获取。
3. iOS平台替代
iOS可使用identifierForVendor作为设备标识,同一开发者的APP在同一设备上值相同,卸载该开发者所有APP后会重置,可通过device_info_plus包获取。
总结
当前主流移动系统都对MAC地址获取做了严格隐私限制,普通第三方APP基本无法获取真实MAC,建议采用上述替代方案实现设备标识需求。
内容的提问来源于stack exchange,提问作者Abdallah Raies
相关产品推荐
相关产品推荐

