Flutter中device_info_plus获取androidId返回null如何解决
问题排查与解决方案
androidId返回null、不在toMap()返回结果里,和你贴的代码逻辑没有直接关系,按以下顺序排查即可:
- 首先排除运行环境问题
安卓模拟器、Windows安卓子系统(WSA)、云测平台的虚拟设备、Google Play Instant即时应用,这类非标准原生系统环境本身就不会生成合法的ANDROID_ID值,插件自然返回null。先找一台无定制修改的普通物理真机,安装debug包测试,80%的这类问题都是环境导致的。 - 检查插件版本与编译状态
device_info_plus3.0.0之前的版本存在高版本安卓系统字段映射bug,会出现读不到androidId的情况。先把依赖升级到最新稳定版:
执行dependencies: device_info_plus: ^9.1.0flutter pub get之后,完全停止正在运行的应用,重新全量编译安装,不要用热重载/热重启——插件涉及原生层代码变更,热重载不会生效,这也是新手常踩的坑。 - 确认应用运行场景
如果应用是安装在安卓工作空间、企业管控设备上,系统会主动禁止第三方应用读取设备标识,这种场景下androidId必然返回null,不要依赖硬件ID做唯一标识,改用应用首次启动时本地生成的UUID存在shared_preferences里即可。 - 兼容小众定制ROM
部分小众国产ROM会刻意屏蔽ANDROID_ID读取接口,这种情况加一层降级逻辑即可,不要强依赖androidId单字段。
修正后的兼容代码如下,统一返回字符串类型,避免空值、类型不统一问题:
Future<String> getDeviceId() async { final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); if (Platform.isIOS) { final IosDeviceInfo iosInfo = await deviceInfo.iosInfo; return iosInfo.identifierForVendor ?? ''; } else if (Platform.isAndroid) { final AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; // 优先取系统androidId final String? androidId = androidInfo.androidId; if (androidId != null && androidId.isNotEmpty) { return androidId; } // 降级逻辑:拼接设备硬件信息生成哈希ID,兜底用 final String rawFallback = '${androidInfo.brand}_${androidInfo.model}_${androidInfo.hardware}_${androidInfo.fingerprint}'; return rawFallback.hashCode.toRadixString(16); } return ''; }
补充说明:安卓系统从Android 10开始已经对应用可读取的硬件标识做了严格限制,
androidId本身也会在应用卸载重装、恢复出厂设置后发生变化,不要把它当做永久不变的设备唯一ID使用。
内容的提问来源于stack exchange,提问作者Deogratius Mabima
相关产品推荐
相关产品推荐

