feat: 被控端增加无障碍检查,flutter固定获取Android_Id

This commit is contained in:
2026-07-16 21:56:12 +08:00
parent 68a863c66a
commit 45ee9ef60c
13 changed files with 506 additions and 72 deletions

View File

@@ -1,5 +1,6 @@
import 'dart:io';
import 'package:android_id/android_id.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:uuid/uuid.dart';
@@ -8,15 +9,16 @@ import 'package:uuid/uuid.dart';
/// 与 WebRTCControlled 的 DeviceUtils 对应,但控制端没有系统签名,
/// 因此无法稳定获取真实的硬件序列号,这里采用「不要求准确」的兜底方案:
/// 1. 优先使用官方插件([DeviceInfoPlugin])提供的 serialNumber
/// 2. 失败则使用 iOS 的 identifierForVendor
/// 3. 失败则生成随机 UUID。
/// 2. 如果 serialNumber 为 unknown则尝试获取 Android ID
/// 3. 失败则使用 iOS 的 identifierForVendor
/// 4. 再失败则生成随机 UUID。
class DeviceUtils {
DeviceUtils._();
/// 获取设备标识(适用于普通应用)。
///
/// 兼容各平台Android 使用官方序列号,iOS 使用 identifierForVendor
/// 均不可用时回退到随机 UUID。
/// 兼容各平台Android 优先使用官方序列号,其次使用 Android ID
/// iOS 使用 identifierForVendor均不可用时回退到随机 UUID。
static Future<String> getSerialNumber() async {
const uuid = Uuid();
try {
@@ -27,6 +29,13 @@ class DeviceUtils {
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;

View File

@@ -1,6 +1,14 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
android_id:
dependency: "direct main"
description:
name: android_id
sha256: "543bbfcf316de69d3ac36601d74eeaacd0248178a2671b00ad30d09f35bd3581"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.5.2+1"
args:
dependency: transitive
description:

View File

@@ -48,6 +48,7 @@ dependencies:
device_info_plus: ^11.0.0
protobuf: ^6.0.0
fixnum: ^1.1.1
android_id: ^0.5.2+1
dev_dependencies:
flutter_test: