You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中device_info_plus获取androidId返回null如何解决

问题排查与解决方案

androidId返回null、不在toMap()返回结果里,和你贴的代码逻辑没有直接关系,按以下顺序排查即可:

  • 首先排除运行环境问题
    安卓模拟器、Windows安卓子系统(WSA)、云测平台的虚拟设备、Google Play Instant即时应用,这类非标准原生系统环境本身就不会生成合法的ANDROID_ID值,插件自然返回null。先找一台无定制修改的普通物理真机,安装debug包测试,80%的这类问题都是环境导致的。
  • 检查插件版本与编译状态
    device_info_plus 3.0.0之前的版本存在高版本安卓系统字段映射bug,会出现读不到androidId的情况。先把依赖升级到最新稳定版:
    dependencies:
      device_info_plus: ^9.1.0
    
    执行flutter 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:09:20