Flutter唯一设备标识插件only_unique_device_id的使用
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 上,使用 CFUUID
和 KeyChain
来生成唯一标识符。
开始使用
本项目是一个 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
更多关于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),
),
),
),
);
}
}
在这个示例中:
OnlyUniqueDeviceId.getDeviceId
是一个异步方法,用于获取设备的唯一标识符。- 在
initState
方法中调用_getDeviceId
方法,以确保在组件加载时就开始获取设备ID。 - 使用
setState
来更新UI,当设备ID获取成功后,显示设备ID;如果获取失败,则显示错误信息(这里简单打印到控制台)。
请注意,only_unique_device_id
插件背后可能使用了平台特定的API来获取设备ID,例如Android的Settings.Secure.ANDROID_ID
或iOS的identifierForVendor
。由于隐私政策的变化,这些API的行为可能会随操作系统版本而变化,因此始终建议测试你的应用在不同设备和操作系统版本上的行为。
此外,确保你的应用遵循相关的隐私政策,特别是当用户数据收集和使用方面。