Flutter中如何正确获取Android设备的Device ID?
解决DeviceInfoPlugin获取正确Device ID的问题
你当前代码里用androidInfo.id获取设备ID,但这个字段在不同Android版本返回的内容并不稳定:Android 8.0及以上系统中,它返回的是系统随机生成的临时ID,并非你预期的IMEI类标识。以下是针对不同平台的正确获取方式:
Android平台处理
1. 权限配置
如果要获取IMEI(仅Android 9及以下可用),需在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android 6.0+还需要在代码中动态请求该权限。
2. 区分系统版本获取对应标识
- Android 10及以上:系统限制第三方应用获取IMEI,可使用
androidId(设备首次启动生成的稳定标识,恢复出厂设置会重置) - Android 9及以下:可获取
imei作为设备唯一标识
修改后的Android适配代码:
import 'package:permission_handler/permission_handler.dart'; // 需引入permission_handler包 Future<void> _getDeviceId() async { if (kIsWeb) return; try { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; String? targetDeviceId; if (androidInfo.version.sdkInt >= 29) { // Android 10+ 只能获取androidId targetDeviceId = androidInfo.androidId; } else { // Android 9及以下,先申请权限再获取IMEI var permissionStatus = await Permission.phone.request(); if (permissionStatus.isGranted) { targetDeviceId = androidInfo.imei; } else { targetDeviceId = '权限被拒绝,使用androidId替代: ${androidInfo.androidId}'; } } setState(() { deviceId = targetDeviceId ?? '获取设备ID失败'; }); debugPrint("Device ID: $deviceId"); } catch (e) { setState(() { deviceId = '获取设备ID失败'; }); debugPrint("获取设备ID失败: $e"); } }
iOS平台处理
iOS系统不允许第三方应用获取硬件级标识(如IMEI),常用的稳定标识是identifierForVendor(同一开发者的应用在同一设备上共享,卸载所有该开发者应用后会重置),补充iOS处理逻辑:
// 在原代码的try块中添加iOS分支 IosDeviceInfo iosInfo = await deviceInfo.iosInfo; String targetDeviceId = iosInfo.identifierForVendor ?? iosInfo.uuid;
通用注意事项
- 高版本系统对硬件标识的权限限制越来越严格,建议优先使用
androidId(Android)或identifierForVendor(iOS)作为业务标识 - 若需要跨平台统一的标识,可以将获取到的平台标识存入本地存储,后续直接读取使用
内容的提问来源于stack exchange,提问作者sai
相关产品推荐
相关产品推荐

