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> collectEnvironmentInfo() async { final screenInfo = _screenInfo(); final batteryState = await _batteryState(); final fields = { '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 _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 _batteryLevel() async { try { return await Battery().batteryLevel; } catch (_) { return -1; } } Future _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 _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': '', }; } }