Flutter中如何获取安卓唯一设备ID?device-info-plus插件问题
Flutter安卓端获取唯一设备ID的解决方案
问题原因
你当前使用的androidInfo.id在安卓10及以上系统中,受隐私政策限制返回的是系统生成的临时随机ID,不同设备或同一设备的不同场景下可能出现重复,这是导致线上故障的核心原因。
以下是几种可行的替代方案,无需降级device-info-plus插件:
方案1:组合硬件信息生成唯一哈希ID
通过拼接多个硬件相关字段(如序列号、厂商、型号等),再进行哈希处理,生成一个几乎不会重复的唯一ID。该方案无需特殊权限,符合安卓隐私规范。
步骤:
- 在
pubspec.yaml中添加crypto依赖:dependencies: crypto: ^3.0.3 - 实现代码:
import 'package:crypto/crypto.dart'; import 'dart:convert'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; Future<String> generateHardwareBasedId() async { final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); if (defaultTargetPlatform != TargetPlatform.android) return ''; final AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; // 拼接多个硬件特征字段,降低重复概率 final rawString = [ androidInfo.serial, androidInfo.manufacturer, androidInfo.model, androidInfo.board, androidInfo.product ].join('|'); // SHA-256哈希处理,避免明文泄露硬件信息 final bytes = utf8.encode(rawString); final digest = sha256.convert(bytes); return digest.toString(); }
方案2:使用广告ID(Advertising ID)
如果你的业务场景允许用户重置ID(如广告投放、用户统计),可以获取安卓广告ID。该ID由系统生成,用户可在设置中重置,但无需额外权限。
代码实现:
import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; Future<String?> getAdvertisingId() async { final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); if (defaultTargetPlatform != TargetPlatform.android) return null; final AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; return androidInfo.adId; }
方案3:本地存储自定义UUID
在APP首次启动时生成一个UUID,存储到本地持久化存储(如SharedPreferences)中,只要APP不卸载,该ID就保持唯一。适合仅需识别当前APP实例的场景。
步骤:
- 添加
shared_preferences和uuid依赖:dependencies: shared_preferences: ^2.2.2 uuid: ^3.0.7 - 实现代码:
import 'package:shared_preferences/shared_preferences.dart'; import 'package:uuid/uuid.dart'; Future<String> getAppInstanceUniqueId() async { final prefs = await SharedPreferences.getInstance(); final storedId = prefs.getString('app_unique_device_id'); if (storedId != null) return storedId; // 生成新的UUID并存储 final newId = const Uuid().v4(); await prefs.setString('app_unique_device_id', newId); return newId; }
方案选择建议
- 若需要跨APP卸载重装的硬件级唯一识别:选择方案1
- 若用于广告投放、用户统计且允许用户重置:选择方案2
- 若仅需当前APP实例的唯一识别:选择方案3
内容的提问来源于stack exchange,提问作者Harshit
相关产品推荐
相关产品推荐

