Flutter获取的Android ID与原生系统Android ID不一致问题求助
问题根源说明
你当前获取的ID和系统原生Android ID不一致、不知道值对应位置的核心原因是你代码中调用的接口返回值本身就不是系统原生Android ID:
- 你调用的
PlatformDeviceId.getDeviceId()在Android端的返回值:- Android 6.0以下:默认返回设备IMEI/MEID,需要
READ_PHONE_STATE权限 - Android 6.0-9.0:无对应权限时返回空值或占位字符串,有权限时返回IMEI/MEID
- Android 10及以上:谷歌完全禁止第三方应用获取IMEI,该方法返回的是应用级随机标识或者占位值,和系统Android ID完全无关
- Android 6.0以下:默认返回设备IMEI/MEID,需要
- 你代码中赋值给
identifier的build.id是系统固件构建编号,属于系统版本相关标识,同型号、同系统版本的设备该值完全一致,和设备唯一标识没有任何关系
系统原生Android ID说明
系统原生Android ID(全称SSAID)是设备首次启动时系统生成的64位十六进制字符串,对应位置:
- 系统设置路径:原生安卓可在「设置-关于手机-状态信息」中查看,不同厂商定制系统路径可能略有调整,部分厂商会隐藏该值的前台显示
- 可通过adb命令直接查询:
adb shell settings get secure android_id - Android 8.0及以上的隐私保护机制:系统会为不同签名的应用分配不同的Android ID,只有系统应用、同签名的应用才能拿到相同的Android ID,该机制无法绕过
修复方案
要获取对应应用的原生Android ID,直接使用device_info_plugin自带的androidId属性即可,不需要额外调用PlatformDeviceId相关接口,修改后的代码示例:
Future<String?> getDeviceDetails() async { final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); try { if (Platform.isAndroid) { final androidInfo = await deviceInfoPlugin.androidInfo; setState(() { deviceName = androidInfo.model; deviceVersion = androidInfo.version.release; // 直接获取对应应用的Android ID identifier = androidInfo.androidId; }); return identifier; } else if (Platform.isIOS) { final iosInfo = await deviceInfoPlugin.iosInfo; setState(() { deviceName = iosInfo.name; deviceVersion = iosInfo.systemVersion; identifier = iosInfo.identifierForVendor; }); print(identifier); return identifier; } } on PlatformException { print('Failed to get platform version'); return ""; } return null; }
补充注意事项
- Android 10及以上没有官方支持的第三方应用可获取的全局唯一设备ID,所有跨应用统一设备ID的获取方法都需要系统级权限,无法通过正常渠道申请,不要使用非常规手段获取,会导致应用被应用市场拒审
- 如果仅需要应用内的用户唯一标识,推荐自行生成UUID存储在应用本地,兼容性更高,不受系统版本和权限限制
内容的提问来源于stack exchange,提问作者Furqan 695
相关产品推荐
相关产品推荐

