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

Flutter中如何获取安卓唯一设备ID?device-info-plus插件问题

Flutter安卓端获取唯一设备ID的解决方案

问题原因

你当前使用的androidInfo.id在安卓10及以上系统中,受隐私政策限制返回的是系统生成的临时随机ID,不同设备或同一设备的不同场景下可能出现重复,这是导致线上故障的核心原因。

以下是几种可行的替代方案,无需降级device-info-plus插件:

方案1:组合硬件信息生成唯一哈希ID

通过拼接多个硬件相关字段(如序列号、厂商、型号等),再进行哈希处理,生成一个几乎不会重复的唯一ID。该方案无需特殊权限,符合安卓隐私规范。

步骤:

  1. 在pubspec.yaml中添加crypto依赖:
    dependencies:
      crypto: ^3.0.3
    
  2. 实现代码:
    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实例的场景。

步骤:

  1. 添加shared_preferences和uuid依赖:
    dependencies:
      shared_preferences: ^2.2.2
      uuid: ^3.0.7
    
  2. 实现代码:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:40:11