如何在Flutter中获取Android设备唯一标识符?
Android 10+ 设备唯一标识符解决方案思路
核心需求拆解
需要一个稳定的设备标识符,用于区分已分配给客户的设备和可用设备,但Android 10+限制了IMEI、MAC等硬件ID的访问权限,且使用device_info_plus时出现重装应用后标识符变更的问题。
可行解决方案与思路
1. 正确使用Android ID(API 26+)
你提到的64位十六进制唯一值就是Android ID(对应系统API的Settings.Secure.ANDROID_ID),它对应用签名密钥、用户、设备三者的组合唯一,仅在恢复出厂设置或签名密钥变更时才会改变。
- 排查
device_info_plus的使用:确保获取的是androidId字段,而非其他临时生成的标识(如应用实例ID),示例代码:final deviceInfo = await DeviceInfoPlugin().androidInfo; final String stableId = deviceInfo.androidId; // 此为目标稳定标识符 - 注意:多用户设备中不同用户的Android ID不同,若业务为单用户场景可忽略此差异。
2. 本地持久化+云端关联方案
若需规避重装应用导致的标识变更,可结合本地存储与服务器:
- 首次启动:获取Android ID,生成自定义UUID,将UUID与Android ID绑定后存入本地
SharedPreferences,同时上传至服务器关联。 - 后续启动:优先读取本地UUID,若不存在(如重装),则用Android ID向服务器查询对应UUID,存在则复用,不存在则重新生成并绑定。
- 优势:既保留了Android ID的设备关联性,又解决了重装应用的标识断裂问题。
3. 服务器端设备注册机制
若需严格绑定设备(即使恢复出厂也能识别),可采用令牌式注册:
- 应用首次启动时,向服务器请求唯一设备令牌,将令牌存入本地安全存储(如Android KeyStore)。
- 每次启动向服务器上报令牌,服务器通过令牌识别设备。
- 恢复出厂后,用户登录账号时,服务器将新令牌与原账号关联,恢复设备的分配状态。
4. 避坑提醒
- 禁止尝试绕过系统隐私限制获取IMEI/MAC,会导致应用被Google Play拒审,且高版本系统无法获取。
- 不要使用
device_info_plus中的临时标识字段(如id),此类字段为应用安装实例唯一,重装即失效。
内容的提问来源于stack exchange,提问作者Bohdan Ilkiv
相关产品推荐
相关产品推荐

