Files
hjsq_android/analytics_sdk/lib/utils/environment_info_native.dart
T
2026-10-08 11:37:25 +07:00

120 lines
3.0 KiB
Dart

import 'dart:io' show Platform;
import 'dart:ui' show window;
import 'package:battery_plus/battery_plus.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:package_info_plus/package_info_plus.dart';
/// 原生/桌面端环境字段采集。
Future<Map<String, dynamic>> collectEnvironmentInfo() async {
final screenInfo = _screenInfo();
final batteryState = await _batteryState();
final fields = <String, dynamic>{
'language': window.locale.toLanguageTag(),
'timezone': DateTime.now().timeZoneName,
...screenInfo,
'network_type': await _networkType(),
'battery_level': await _batteryLevel(),
'is_charging': _isChargingState(batteryState),
'battery_state': _batteryStateName(batteryState),
'cpu_cores': _cpuCores(),
};
try {
final info = await PackageInfo.fromPlatform();
fields['package_name'] = info.packageName;
} catch (_) {
fields['package_name'] = '';
}
return fields;
}
Future<String> _networkType() async {
try {
final result = await Connectivity().checkConnectivity();
switch (result) {
case ConnectivityResult.wifi:
return 'wifi';
case ConnectivityResult.ethernet:
return 'ethernet';
case ConnectivityResult.mobile:
case ConnectivityResult.none:
case ConnectivityResult.bluetooth:
case ConnectivityResult.vpn:
case ConnectivityResult.other:
return 'unknown';
}
} catch (_) {
return 'unknown';
}
}
Future<int> _batteryLevel() async {
try {
return await Battery().batteryLevel;
} catch (_) {
return -1;
}
}
Future<BatteryState> _batteryState() async {
try {
return await Battery().batteryState;
} catch (_) {
return BatteryState.unknown;
}
}
int _isChargingState(BatteryState state) {
if (state == BatteryState.charging || state == BatteryState.full) return 1;
if (state == BatteryState.discharging) return 0;
return -1;
}
String _batteryStateName(BatteryState state) {
switch (state) {
case BatteryState.charging:
return 'charging';
case BatteryState.discharging:
return 'discharging';
case BatteryState.full:
return 'full';
case BatteryState.unknown:
return 'unknown';
}
}
int _cpuCores() {
try {
return Platform.numberOfProcessors;
} catch (_) {
return -1;
}
}
Map<String, dynamic> _screenInfo() {
try {
final size = window.physicalSize;
final width = size.width.round();
final height = size.height.round();
final pixelRatio = (window.devicePixelRatio * 100).round();
final dpi = (window.devicePixelRatio * 160).round();
return {
'screen_width': width,
'screen_height': height,
'screen_dpi': dpi,
'device_pixel_ratio': pixelRatio,
'orientation': width >= height ? 'landscape' : 'portrait',
};
} catch (_) {
return const {
'screen_width': -1,
'screen_height': -1,
'screen_dpi': -1,
'device_pixel_ratio': -1,
'orientation': '',
};
}
}