Files
VibeCoding/webrtc_controller_flutter/lib/utils/device_utils.dart

52 lines
1.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:io';
import 'package:android_id/android_id.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:uuid/uuid.dart';
/// 设备信息工具类(控制端,非系统签名应用)
///
/// 与 WebRTCControlled 的 DeviceUtils 对应,但控制端没有系统签名,
/// 因此无法稳定获取真实的硬件序列号,这里采用「不要求准确」的兜底方案:
/// 1. 优先使用官方插件([DeviceInfoPlugin])提供的 serialNumber
/// 2. 如果 serialNumber 为 unknown则尝试获取 Android ID
/// 3. 失败则使用 iOS 的 identifierForVendor
/// 4. 再失败则生成随机 UUID。
class DeviceUtils {
DeviceUtils._();
/// 获取设备标识(适用于普通应用)。
///
/// 兼容各平台Android 优先使用官方序列号,其次使用 Android ID
/// iOS 使用 identifierForVendor均不可用时回退到随机 UUID。
static Future<String> getSerialNumber() async {
const uuid = Uuid();
try {
final deviceInfo = DeviceInfoPlugin();
if (Platform.isAndroid) {
final androidInfo = await deviceInfo.androidInfo;
final serial = androidInfo.serialNumber;
if (serial.isNotEmpty && serial.toLowerCase() != 'unknown') {
return serial;
}
// 如果 serialNumber 获取失败,尝试获取 Android ID
const androidIdPlugin = AndroidId();
final androidId = await androidIdPlugin.getId();
if (androidId != null && androidId.isNotEmpty) {
return androidId;
}
} else if (Platform.isIOS) {
final iosInfo = await deviceInfo.iosInfo;
final id = iosInfo.identifierForVendor;
if (id != null && id.isNotEmpty) {
return id;
}
}
} catch (_) {
// 获取失败,走兜底逻辑
}
return uuid.v4();
}
}