Flutter唯一设备标识插件only_unique_device_id的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter唯一设备标识插件only_unique_device_id的使用

only_unique_device_id 是一个能够获取唯一设备标识符的 Flutter 插件。

使用

import 'package:only_unique_device_id/only_unique_device_id.dart' as OnlyUniqueDeviceId;

Future<String?> get_only_unique_device_id() async {
  // 获取唯一的设备ID
  String? uniqueDeviceId = 
      await OnlyUniqueDeviceId.OnlyUniqueDeviceId().getOnlyUniqueDeviceId();
  print(uniqueDeviceId);
  return uniqueDeviceId;
}

关于 Android

在 Android 上,获取唯一设备标识符的方法通常需要权限。然而,有时我们只需要跟踪设备安装情况。在这种情况下,我们可以创建一个“伪唯一标识符”,仅基于 Android API 提供的信息而无需额外的权限。这样可以尊重用户并提供良好的用户体验。

如何实现?
private String getUniquePsuedoID() {
    // 如果所有其他方法都失败了,如果用户的 API 级别低于 9(低于 Gingerbread),已经重置了设备或 'Secure.ANDROID_ID' 返回 'null',
    // 那么返回的 ID 将完全基于他们的 Android 设备信息。这可能会导致冲突。
    // 感谢 PocketMagic 的贡献!
    // 尽量不要使用 DISPLAY、HOST 或 ID - 这些项目可能会更改。
    // 如果有冲突,则会有重叠的数据
    String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);

    // 感谢 Roman SL 的贡献!
    // https://stackoverflow.com/a/4789483/950427
    // 只有 API >= 9 的设备才有 android.os.Build.SERIAL
    // http://developer.android.com/reference/android/os/Build.html#SERIAL
    // 如果用户升级软件或越狱了设备,将会有重复的条目
    String serial = null;
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            serial = android.os.Build.getSerial();
        } else {
            serial = Build.SERIAL;
        }
        // 继续返回 API >= 9 的序列号
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    } catch (Exception exception) {
        // 字符串需要初始化
        final String androidId = "" + android.provider.Settings.Secure.getString(_flutterPluginBinding.getApplicationContext().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
        serial = androidId;
    }

    // 如果 Build.SERIAL 获取成功,那么 'id' 很可能是唯一的;如果没有,我们使用 androidId 来保证 'id' 尽可能唯一而不使用任何权限

    // 感谢 Joe 的贡献!
    // https://stackoverflow.com/a/2853253/950427
    // 最后,结合我们找到的值,通过使用 UUID 类来创建一个唯一的标识符
    return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}

关于 iOS

在 iOS 上,使用 CFUUIDKeyChain 来生成唯一标识符。

开始使用

本项目是一个 Flutter 插件包的起点,包含针对 Android 和/或 iOS 的平台特定实现代码。

感谢


示例代码

以下是 example/lib/main.dart 的示例代码:

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:only_unique_device_id/only_unique_device_id.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _onlyUniqueDeviceIdPlugin = OnlyUniqueDeviceId();

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 平台消息是异步的,因此我们在异步方法中进行初始化。
  Future<void> initPlatformState() async {
    String platformVersion;
    // 平台消息可能会失败,所以我们使用 try/catch 来捕获 PlatformException。
    // 我们还处理消息可能返回 null 的情况。
    try {
      platformVersion =
          await _onlyUniqueDeviceIdPlugin.getOnlyUniqueDeviceId() ??
              'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果在异步平台消息还在飞行时小部件从树中移除,我们希望丢弃回复而不是调用
    // setState 更新我们的非存在的外观。
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: Text('运行在: $_platformVersion\n'),
        ),
      ),
    );
  }
}

更多关于Flutter唯一设备标识插件only_unique_device_id的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter唯一设备标识插件only_unique_device_id的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用only_unique_device_id插件来获取唯一设备标识的示例代码。这个插件可以帮助你获取设备的唯一标识符,尽管请注意,由于隐私和安全的原因,获取设备唯一标识的方式在不同平台和版本上可能会有所不同。

首先,确保你已经在pubspec.yaml文件中添加了only_unique_device_id依赖:

dependencies:
  flutter:
    sdk: flutter
  only_unique_device_id: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用以下代码来获取设备的唯一标识符:

import 'package:flutter/material.dart';
import 'package:only_unique_device_id/only_unique_device_id.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? deviceId;

  @override
  void initState() {
    super.initState();
    _getDeviceId();
  }

  Future<void> _getDeviceId() async {
    try {
      String? id = await OnlyUniqueDeviceId.getDeviceId;
      setState(() {
        deviceId = id;
      });
    } catch (e) {
      print('Error getting device ID: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Device ID Example'),
        ),
        body: Center(
          child: Text(
            deviceId ?? 'Loading...',
            style: TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. OnlyUniqueDeviceId.getDeviceId是一个异步方法,用于获取设备的唯一标识符。
  2. initState方法中调用_getDeviceId方法,以确保在组件加载时就开始获取设备ID。
  3. 使用setState来更新UI,当设备ID获取成功后,显示设备ID;如果获取失败,则显示错误信息(这里简单打印到控制台)。

请注意,only_unique_device_id插件背后可能使用了平台特定的API来获取设备ID,例如Android的Settings.Secure.ANDROID_ID或iOS的identifierForVendor。由于隐私政策的变化,这些API的行为可能会随操作系统版本而变化,因此始终建议测试你的应用在不同设备和操作系统版本上的行为。

此外,确保你的应用遵循相关的隐私政策,特别是当用户数据收集和使用方面。

回到顶部