diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index 899e87492..73826786b 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -1,4 +1,4 @@ -import 'package:deep_voice/data/services/user_portrait.dart'; +import '../../../data/services/user_portrait.dart'; import '../../../data/services/location_manager.dart'; import '../../../data/services/music_manager.dart'; diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 48cd5df5f..5af4469ef 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -522,6 +522,47 @@ const Map enUS = { 'You have permanently denied {permission} permission, please go to app settings to enable it', 'goToSettings': 'Go to Settings', + // 权限申请 + 'bluetoothScan': 'Bluetooth Scan', + 'bluetoothConnect': 'Bluetooth Connect', + 'bluetoothScanExplanation': + 'The app needs Bluetooth scan permission to scan nearby Bluetooth devices.', + 'bluetoothConnectExplanation': + 'The app needs Bluetooth connect permission to connect to Bluetooth devices.', + 'locationForBluetoothExplanation': + 'The app needs location permission to scan Bluetooth devices.', + 'bluetoothScanPermanentDenial': + 'Bluetooth scan permission has been permanently denied, please go to settings to enable it manually.', + 'bluetoothConnectPermanentDenial': + 'Bluetooth connect permission has been permanently denied, please go to settings to enable it manually.', + 'notificationPermission': 'Notification', + 'locationPermission': 'Location', + 'notificationPermissionExplanation': + 'Notification permission is required to display music playback status.', + 'locationPermissionExplanation': + 'Location permission is required to get current location.', + 'notificationPermissionPermanentDenial': + 'You have permanently denied notification permission, please go to settings to enable it.', + 'locationPermissionPermanentDenial': + 'You have permanently denied location permission, please go to settings to enable it.', + //'microphonePermission': 'Microphone', + 'storagePermission': 'Storage', + 'microphonePermissionExplanation': + 'We need microphone permission to record audio content.', + 'storagePermissionExplanation': + 'We need storage permission so you can select and upload audio files.', + 'microphonePermissionPermanentDenial': + 'Microphone permission has been permanently denied. To continue using this feature, please go to app settings to manually enable microphone permission.', + 'storagePermissionPermanentDenial': + 'Storage permission has been permanently denied. To continue using this feature, please go to app settings to manually enable storage permission.', + +//permission_util.dart + 'permissionUtilNeed': 'Need ', + 'permissionUtilPermission': ' Permission', + 'permissionUtilRestricted': ' Permission Restricted', + 'permissionUtilRestrictedMessage': + 'This feature is unavailable or restricted on the current device, please check device settings or system restrictions', + 'permissionUtilConfirm': 'OK', // 版本更新对话框 'newVersionFound': 'New Version Found', // 版本更新对话框标题 'remindLater': 'Remind Later', // 稍后提醒按钮 diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 177613276..ebf87b6d8 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -482,6 +482,37 @@ const Map zhCN = { 'permanentDenialText': '您已永久拒绝{permission}权限,请前往应用设置开启', 'goToSettings': '去设置', + // 权限申请 + 'bluetoothScan': '蓝牙扫描', + 'bluetoothConnect': '蓝牙连接', + 'bluetoothScanExplanation': '为了扫描附近的蓝牙设备,应用需要获取蓝牙扫描权限。', + 'bluetoothConnectExplanation': '为了连接蓝牙设备,应用需要获取蓝牙连接权限。', + 'locationForBluetoothExplanation': '为了扫描蓝牙设备,应用需要获取位置信息权限。', + 'bluetoothScanPermanentDenial': '蓝牙扫描权限已被永久拒绝,请前往设置手动开启。', + 'bluetoothConnectPermanentDenial': '蓝牙连接权限已被永久拒绝,请前往设置手动开启。', + 'locationPermanentDenial': '位置信息权限已被永久拒绝,请前往设置手动开启。', + 'notificationPermission': '通知', + 'locationPermission': '定位', + 'notificationPermissionExplanation': '需要通知权限来显示音乐播放状态。', + 'locationPermissionExplanation': '需要定位权限来获取当前位置。', + 'notificationPermissionPermanentDenial': '您已永久拒绝通知权限,请前往设置开启权限。', + 'locationPermissionPermanentDenial': '您已永久拒绝定位权限,请前往设置开启权限。', +//'microphonePermission': '录音', + 'storagePermission': '存储', + 'microphonePermissionExplanation': '我们需要访问麦克风权限,以便您录制音频内容。', + 'storagePermissionExplanation': '我们需要访问存储权限,以便您可以选择并上传音频文件。', + 'microphonePermissionPermanentDenial': + '检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。', + 'storagePermissionPermanentDenial': + '检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。', + + //permission_util.dart + 'permissionUtilNeed': '需要', + 'permissionUtilPermission': '权限', + 'permissionUtilRestricted': '权限受限', + 'permissionUtilRestrictedMessage': '此功能在当前设备上不可用或受限,请检查设备设置或系统限制', + 'permissionUtilConfirm': '确定', + // 版本更新对话框 'newVersionFound': '发现新版本', // 版本更新对话框标题 'remindLater': '稍后提醒', // 稍后提醒按钮 diff --git a/lib/core/utils/permission_util.dart b/lib/core/utils/permission_util.dart index 04ea36e25..2a88c5cd9 100644 --- a/lib/core/utils/permission_util.dart +++ b/lib/core/utils/permission_util.dart @@ -42,9 +42,14 @@ class PermissionUtil { required String permissionName, required String explanationText, required String permanentDenialText, - String settingsButtonText = '前往设置', - String cancelButtonText = '取消', + String? settingsButtonText, + String? cancelButtonText, }) async { + // 使用翻译键作为默认值 + final String finalSettingsButtonText = + settingsButtonText ?? 'goToSettings'.tr; + final String finalCancelButtonText = cancelButtonText ?? 'cancel'.tr; + try { // 检查初始权限状态 final PermissionStatus status = await permissionType.status; @@ -73,8 +78,8 @@ class PermissionUtil { // context: context, permissionName: permissionName, permanentDenialText: permanentDenialText, - settingsButtonText: settingsButtonText, - cancelButtonText: cancelButtonText, + settingsButtonText: finalSettingsButtonText, + cancelButtonText: finalCancelButtonText, ); // 移除解释横幅 _hideExplanationOverlay(); @@ -109,8 +114,8 @@ class PermissionUtil { // context: context, permissionName: permissionName, permanentDenialText: permanentDenialText, - settingsButtonText: settingsButtonText, - cancelButtonText: cancelButtonText, + settingsButtonText: finalSettingsButtonText, + cancelButtonText: finalCancelButtonText, ); _hideExplanationOverlay(); return result; @@ -171,7 +176,7 @@ class PermissionUtil { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - '需要$permissionName权限', + 'permissionUtilNeed'.tr + permissionName + 'permissionUtilPermission'.tr, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16, @@ -256,7 +261,7 @@ class PermissionUtil { bool? userChoice = await Get.dialog( AlertDialog( - title: Text('需要$permissionName权限'), + title: Text('permissionUtilNeed'.tr + permissionName + 'permissionUtilPermission'.tr), content: Text(permanentDenialText), actions: [ TextButton( @@ -301,8 +306,8 @@ class PermissionUtil { Logger.w('PermissionUtil', '显示受限权限对话框 ($permissionName)'); Get.dialog( AlertDialog( - title: Text('$permissionName权限受限'), - content: const Text('此功能在当前设备上不可用或受限,请检查设备设置或系统限制'), + title: Text(permissionName + 'permissionUtilRestricted'.tr), + content: Text('permissionUtilRestrictedMessage'.tr), actions: [ TextButton( onPressed: () { @@ -310,7 +315,7 @@ class PermissionUtil { // Navigator.pop(context); Get.back(); }, - child: const Text('确定'), + child: Text('permissionUtilConfirm'.tr), ), ], ), diff --git a/lib/data/models/channel_app_model.dart b/lib/data/models/channel_app_model.dart index fbf3b0bf2..7fc3dcabf 100644 --- a/lib/data/models/channel_app_model.dart +++ b/lib/data/models/channel_app_model.dart @@ -74,7 +74,7 @@ class AppInfo { required this.channel, required this.description, required this.version, - required this.tourists, + this.tourists = false, }); factory AppInfo.fromJson(Map json) => diff --git a/lib/data/models/channel_app_model.g.dart b/lib/data/models/channel_app_model.g.dart index 2c6e524f5..952f3fc41 100644 --- a/lib/data/models/channel_app_model.g.dart +++ b/lib/data/models/channel_app_model.g.dart @@ -37,7 +37,7 @@ AppInfo _$AppInfoFromJson(Map json) => AppInfo( channel: UserChannel.fromJson(json['channel']), description: json['description'] as String, version: json['version'] as String, - tourists: json['tourists'] as bool, + tourists: json['tourists'] as bool? ?? false, ); Map _$AppInfoToJson(AppInfo instance) => { diff --git a/lib/data/services/location_manager.dart b/lib/data/services/location_manager.dart index 15a559ec4..412801df1 100644 --- a/lib/data/services/location_manager.dart +++ b/lib/data/services/location_manager.dart @@ -23,11 +23,11 @@ class LocationManager extends GetxService { final granted = await PermissionUtil.instance.requestPermission( // context: context, permissionType: Permission.locationAlways, - permissionName: '通知', - explanationText: '需要定位权限来获取当前位置。', - permanentDenialText: '您已永久定位通知权限,请前往设置开启权限。', - settingsButtonText: '去设置', - cancelButtonText: '取消', + permissionName: 'locationPermission'.tr, + explanationText: 'locationPermissionExplanation'.tr, + permanentDenialText: 'locationPermissionPermanentDenial'.tr, + settingsButtonText: 'goToSettings'.tr, + cancelButtonText: 'cancel'.tr, ); if (!granted) { diff --git a/lib/data/services/music_manager.dart b/lib/data/services/music_manager.dart index c184a9b78..e761e1a37 100644 --- a/lib/data/services/music_manager.dart +++ b/lib/data/services/music_manager.dart @@ -28,13 +28,13 @@ class MusicManager extends GetxService { Future requestNotificationPermission() async { final granted = await PermissionUtil.instance.requestPermission( - // context: context, + //context: context, permissionType: Permission.notification, - permissionName: '通知', - explanationText: '需要通知权限来显示音乐播放状态。', - permanentDenialText: '您已永久拒绝通知权限,请前往设置开启权限。', - settingsButtonText: '去设置', - cancelButtonText: '取消', + permissionName: 'notificationPermission'.tr, + explanationText: 'notificationPermissionExplanation'.tr, + permanentDenialText: 'notificationPermissionPermanentDenial'.tr, + settingsButtonText: 'goToSettings'.tr, + cancelButtonText: 'cancel'.tr, ); if (!granted) { diff --git a/lib/data/services/version_update_service.dart b/lib/data/services/version_update_service.dart index 6d44c34a1..f2696b5b8 100644 --- a/lib/data/services/version_update_service.dart +++ b/lib/data/services/version_update_service.dart @@ -7,6 +7,7 @@ import 'package:logger/logger.dart'; import 'package:device_info_plus/device_info_plus.dart'; import '../models/channel_app_model.dart'; import 'network/api.dart'; +import 'dart:math' as math; /// 版本更新服务类 class VersionUpdateService extends GetxService { @@ -128,7 +129,7 @@ class VersionUpdateService extends GetxService { final response = await Api.getChannelApp({'channel': platformInfo.channel.value}); - print('获取渠道包信息:$response'); + _logger.d('获取渠道包信息:$response'); if (response == null || !response.containsKey('app')) { return VersionUpdateInfo( @@ -142,6 +143,7 @@ class VersionUpdateService extends GetxService { //final channelAppResponse = ChannelAppResponse.fromJson(response); // 直接从response中获取app信息 final appInfo = AppInfo.fromJson(response['app']); + _logger.d('获取到的最新版本信息: ${appInfo.toJson()}'); // 设置游客登录显示状态 isShowTourists.value = appInfo.tourists; @@ -170,8 +172,8 @@ class VersionUpdateService extends GetxService { return VersionUpdateInfo( hasUpdate: hasUpdate, - currentVersion: currentVersion, - latestVersion: appInfo.version, + currentVersion: currentVersion.split('+')[0], + latestVersion: appInfo.version.split('+')[0], appInfo: appInfo, updateType: updateType, ); @@ -204,7 +206,14 @@ class VersionUpdateService extends GetxService { // 比较主版本号(第一位) if (currentVersions.isNotEmpty && latestVersions.isNotEmpty) { - return currentVersions[0] != latestVersions[0]; + if (currentVersions[0] != latestVersions[0]) { + return true; + } + } + + // 检查是否有两个或更多的 + 号,如果有则强制更新 + if (latest.split('+').length > 2) { + return true; } return false; @@ -218,24 +227,25 @@ class VersionUpdateService extends GetxService { /// 返回true表示需要更新(远程版本更高) bool _compareVersions(String current, String latest) { // 拆分版本号与构建号 - final currentParts = current.split('+'); - final latestParts = latest.split('+'); + final currentParts = current.split('+')[0]; + final latestParts = latest.split('+')[0]; // 解析版本号 (major.minor.patch) - final currentVersions = currentParts[0].split('.').map(int.parse).toList(); - final latestVersions = latestParts[0].split('.').map(int.parse).toList(); + final currentVersions = currentParts.split('.').map(int.parse).toList(); + final latestVersions = latestParts.split('.').map(int.parse).toList(); + + // 使用较小的长度进行比较,避免索引越界 + final minLength = math.min(currentVersions.length, latestVersions.length); // 逐级比较版本号 - for (var i = 0; i < currentVersions.length; i++) { + for (var i = 0; i < minLength; i++) { if (latestVersions[i] > currentVersions[i]) return true; if (latestVersions[i] < currentVersions[i]) return false; } - // 版本号相同则比较构建号 - if (latestParts.length > 1 && currentParts.length > 1) { - return int.parse(latestParts[1]) > int.parse(currentParts[1]); - } - return false; + // 如果前面的版本号都相同,比较长度 + // 更长的版本号被认为是更新的版本(如 1.0.1 > 1.0) + return latestVersions.length > currentVersions.length; } /// 解析版本号字符串为数字数组 diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart index 41c57c10d..31db67e15 100644 --- a/lib/modules/home/controllers/home_controller.dart +++ b/lib/modules/home/controllers/home_controller.dart @@ -5,6 +5,9 @@ import '../../../core/utils/logger.dart'; import 'package:flutter/material.dart'; import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/ble_manager.dart'; +import '../../../data/services/version_update_service.dart'; +import '../../common/widgets/version_update_dialog.dart'; +import 'package:get_storage/get_storage.dart'; /// 连接状态枚举 enum ConnectionStatus { @@ -50,6 +53,14 @@ class HomeController extends GetxController { final _bluetoothManager = Get.find(); final _bleManager = Get.find(); + final _storage = GetStorage(); + + // 会话级别的版本检查标记(静态变量,整个应用会话期间保持) + static bool _hasCheckedVersionInSession = false; + + // 版本检查相关常量 + static const String _lastVersionCheckKey = 'last_version_check_timestamp'; + static const int _versionCheckIntervalHours = 24; // 24小时间隔 @override void onInit() { super.onInit(); @@ -67,6 +78,12 @@ class HomeController extends GetxController { void _initWithCachedInfo() { _setupStateListeners(); _checkConnectionStatus(); + + // 延迟检查版本更新,避免影响页面加载 + // 混合检查机制:会话检查 + 24小时间隔检查 + Future.delayed(const Duration(seconds: 2), () { + _checkVersionUpdateIfNeeded(); + }); } void _setupStateListeners() { @@ -253,4 +270,104 @@ class HomeController extends GetxController { ? deviceInfo.value!.firmwareVersion : 'unknown'.tr; } + + /// 混合检查机制:判断是否需要进行版本检查 + /// 检查条件:1. 会话内未检查过 OR 2. 距离上次检查超过24小时 + void _checkVersionUpdateIfNeeded() { + try { + final now = DateTime.now(); + final lastCheckTimestamp = _storage.read(_lastVersionCheckKey); + + bool shouldCheck = false; + String reason = ''; + + // 条件1:会话内未检查过 + if (!_hasCheckedVersionInSession) { + shouldCheck = true; + reason = '会话内首次检查'; + } + // 条件2:距离上次检查超过24小时 + else if (lastCheckTimestamp != null) { + final lastCheckTime = DateTime.fromMillisecondsSinceEpoch(lastCheckTimestamp); + final timeDifference = now.difference(lastCheckTime); + + if (timeDifference.inHours >= _versionCheckIntervalHours) { + shouldCheck = true; + reason = '距离上次检查已超过${_versionCheckIntervalHours}小时'; + } + } + // 条件3:从未检查过(首次使用应用) + else { + shouldCheck = true; + reason = '首次使用应用'; + } + + if (shouldCheck) { + Logger.i(_tag, '开始版本检查 - 原因: $reason'); + _performVersionCheck(); + } else { + Logger.i(_tag, '跳过版本检查 - 会话内已检查且未超过时间间隔'); + } + } catch (e) { + Logger.e(_tag, '版本检查判断失败: $e'); + } + } + + /// 执行版本检查(在后台进行,不阻塞启动流程) + Future _performVersionCheck() async { + try { + final versionService = VersionUpdateService.to; + final updateInfo = await versionService.checkForUpdate(); + + if (updateInfo.hasUpdate) { + Logger.i(_tag, '发现新版本: ${updateInfo.latestVersion}'); + // 显示更新对话框 + await VersionUpdateDialog.show(updateInfo); + } else { + Logger.i(_tag, '当前已是最新版本: ${updateInfo.currentVersion}'); + } + + // 更新检查记录 + _updateVersionCheckRecord(); + } catch (e) { + Logger.e(_tag, '版本检查失败: $e'); + // 即使检查失败,也更新记录,避免频繁重试 + _updateVersionCheckRecord(); + } + } + + /// 更新版本检查记录 + void _updateVersionCheckRecord() { + try { + // 更新时间戳 + final now = DateTime.now(); + _storage.write(_lastVersionCheckKey, now.millisecondsSinceEpoch); + + // 标记本次会话已检查过版本 + _hasCheckedVersionInSession = true; + + Logger.i(_tag, '版本检查记录已更新: ${now.toIso8601String()}'); + } catch (e) { + Logger.e(_tag, '更新版本检查记录失败: $e'); + } + } + + /// 重置版本检查标记(可用于强制重新检查) + /// 注意:这会清除会话标记,但不会清除时间戳记录 + static void resetVersionCheckFlag() { + _hasCheckedVersionInSession = false; + Logger.i('HomeCtrl', '版本检查会话标记已重置'); + } + + /// 完全重置版本检查状态(包括时间戳) + /// 用于测试或特殊情况下强制重新检查 + void forceResetVersionCheck() { + try { + _hasCheckedVersionInSession = false; + _storage.remove(_lastVersionCheckKey); + Logger.i(_tag, '版本检查状态已完全重置'); + } catch (e) { + Logger.e(_tag, '重置版本检查状态失败: $e'); + } + } } diff --git a/lib/modules/login/controllers/login_controller.dart b/lib/modules/login/controllers/login_controller.dart index ab1c500ff..1aa42acf1 100644 --- a/lib/modules/login/controllers/login_controller.dart +++ b/lib/modules/login/controllers/login_controller.dart @@ -210,12 +210,12 @@ class LoginController extends GetxController { //如果用户未接受隐私政策,显示弹窗 if (!_hasAcceptedPrivacy.value) { _showPrivacyDialog(); - } - }); - + } else { _initDeviceInfo(); _initAppInfo(); // 新增:初始化APP信息 _checkGuestLoginConfig(); // 检查游客登录配置 + } + }); } @override @@ -229,7 +229,6 @@ class LoginController extends GetxController { Future _checkGuestLoginConfig() async { try { final versionService = VersionUpdateService.to; - await versionService.checkForUpdate(); // 先检查版本更新,这会同时设置 isShowTourists 的值 await versionService.checkForUpdate(); @@ -388,6 +387,9 @@ class LoginController extends GetxController { // 用户同意,关闭弹窗并继续 _hasAcceptedPrivacy.value = true; Get.back(); + _initDeviceInfo(); + _initAppInfo(); // 新增:初始化APP信息 + _checkGuestLoginConfig(); // 检查游客登录配置 }, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF0066CC), @@ -712,13 +714,6 @@ class LoginController extends GetxController { //验证隐私协议勾选状态 if (!_hasAcceptedPrivacy.value) { - // Get.snackbar( - // 'tip'.tr, - // 'pleaseAcceptPrivacyPolicy'.tr, - // snackPosition: SnackPosition.TOP, - // backgroundColor: Colors.red.withOpacity(0.1), - // colorText: Colors.red, - // ); _showPrivacyDialog(); return; } diff --git a/lib/modules/meeting/controllers/meeting_record_controller.dart b/lib/modules/meeting/controllers/meeting_record_controller.dart index 3ebec2940..8cd767ee0 100644 --- a/lib/modules/meeting/controllers/meeting_record_controller.dart +++ b/lib/modules/meeting/controllers/meeting_record_controller.dart @@ -103,9 +103,9 @@ class MeetingRecordController extends GetxController try { final bool granted = await PermissionUtil.instance.requestPermission( permissionType: Permission.microphone, - permissionName: "录音", - explanationText: "我们需要访问麦克风权限,以便您录制音频内容。", - permanentDenialText: "检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。", + permissionName: 'microphonePermission'.tr, + explanationText: 'microphonePermissionExplanation'.tr, + permanentDenialText: 'microphonePermissionPermanentDenial'.tr, ); if (granted) { diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index ee754021a..ec5902c1b 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -420,14 +420,30 @@ class PairingController extends GetxController { Future _checkPermissions() async { // Android权限检查 if (Platform.isAndroid) { + Logger.i(_tag, '开始检查Android权限'); // 检查蓝牙相关权限 - final bluetoothScan = await Permission.bluetoothScan.request(); - final bluetoothConnect = await Permission.bluetoothConnect.request(); - final location = await Permission.locationWhenInUse.request(); + final bluetoothScanGranted = + await PermissionUtil.instance.requestPermission( + permissionType: Permission.bluetoothScan, + permissionName: 'bluetoothScan'.tr, + explanationText: 'bluetoothScanExplanation'.tr, + permanentDenialText: 'bluetoothScanPermanentDenial'.tr, + ); + final bluetoothConnectGranted = + await PermissionUtil.instance.requestPermission( + permissionType: Permission.bluetoothConnect, + permissionName: 'bluetoothConnect'.tr, + explanationText: 'bluetoothConnectExplanation'.tr, + permanentDenialText: 'bluetoothConnectPermanentDenial'.tr, + ); + final locationGranted = await PermissionUtil.instance.requestPermission( + permissionType: Permission.locationWhenInUse, + permissionName: 'locationInfo'.tr, + explanationText: 'locationForBluetoothExplanation'.tr, + permanentDenialText: 'locationPermanentDenial'.tr, + ); - return bluetoothScan.isGranted && - bluetoothConnect.isGranted && - location.isGranted; + return bluetoothScanGranted && bluetoothConnectGranted && locationGranted; } return true; } diff --git a/lib/modules/profile/controllers/profile_controller.dart b/lib/modules/profile/controllers/profile_controller.dart index 260b4ef73..3dd9b3864 100644 --- a/lib/modules/profile/controllers/profile_controller.dart +++ b/lib/modules/profile/controllers/profile_controller.dart @@ -1,4 +1,4 @@ -import 'package:deep_voice/data/services/user_portrait.dart'; +import '/data/services/user_portrait.dart'; import 'package:dio/dio.dart' as dio; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; diff --git a/lib/modules/settings/controllers/settings_controller.dart b/lib/modules/settings/controllers/settings_controller.dart index 6df73311d..c54681186 100644 --- a/lib/modules/settings/controllers/settings_controller.dart +++ b/lib/modules/settings/controllers/settings_controller.dart @@ -197,14 +197,6 @@ class SettingsController extends GetxController { ]; // 检查单个权限状态 - Future checkPermission(Permission permission) async { - return await permission.status; - } - - // 请求单个权限 - Future requestPermission(Permission permission) async { - return await permission.request(); - } // 打开应用设置 void openSettings() { @@ -514,8 +506,9 @@ class SettingsController extends GetxController { // 显示已是最新版本的提示 Get.snackbar( 'checkUpdate'.tr, - 'currentLatestVersion' //当前已是最新版本 - .trParams({'version': updateInfo.currentVersion}), + 'currentLatestVersion' + .tr //当前已是最新版本 + .replaceAll('{version}', updateInfo.currentVersion), snackPosition: SnackPosition.TOP, backgroundColor: Colors.green.withOpacity(0.8), colorText: Colors.white, diff --git a/lib/modules/splash/controllers/splash_controller.dart b/lib/modules/splash/controllers/splash_controller.dart index c477bb755..3e23b4adb 100644 --- a/lib/modules/splash/controllers/splash_controller.dart +++ b/lib/modules/splash/controllers/splash_controller.dart @@ -76,7 +76,7 @@ class SplashController extends GetxController { // await _initDatabase(); // 检查版本更新(在后台进行,不阻塞启动流程) - _checkVersionUpdate(); + //_checkVersionUpdate(); _isResourceLoaded.value = true; _checkNavigateCondition(); @@ -158,21 +158,21 @@ class SplashController extends GetxController { } /// 检查版本更新(后台执行,不阻塞启动流程) - void _checkVersionUpdate() { - // 延迟执行版本检查,避免影响启动速度 - Timer(const Duration(seconds: 1), () async { - try { - final versionService = VersionUpdateService.to; - final updateInfo = await versionService.checkForUpdate(); - - if (updateInfo.hasUpdate) { - // 显示更新对话框 - await VersionUpdateDialog.show(updateInfo); - } - } catch (e) { - print('版本检查失败: $e'); - // 版本检查失败不影响用户使用,静默处理 - } - }); - } + // void _checkVersionUpdate() { + // // 延迟执行版本检查,避免影响启动速度 + // Timer(const Duration(seconds: 1), () async { + // try { + // final versionService = VersionUpdateService.to; + // final updateInfo = await versionService.checkForUpdate(); + + // if (updateInfo.hasUpdate) { + // // 显示更新对话框 + // await VersionUpdateDialog.show(updateInfo); + // } + // } catch (e) { + // print('版本检查失败: $e'); + // // 版本检查失败不影响用户使用,静默处理 + // } + // }); + // } } diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index 703c87575..7290b4fbb 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -224,9 +224,9 @@ class TranslationController extends GetxController { try { final bool granted = await PermissionUtil.instance.requestPermission( permissionType: Permission.microphone, - permissionName: "录音", - explanationText: "我们需要访问麦克风权限,以便您录制音频内容。", - permanentDenialText: "检测到您已永久拒绝录音权限。如需继续使用此功能,请前往应用设置中手动开启麦克风权限。", + permissionName: 'microphonePermission'.tr, + explanationText: 'microphonePermissionExplanation'.tr, + permanentDenialText: 'microphonePermissionPermanentDenial'.tr, ); if (granted) { @@ -248,9 +248,9 @@ class TranslationController extends GetxController { try { final bool granted = await PermissionUtil.instance.requestPermission( permissionType: Permission.storage, - permissionName: "存储", - explanationText: "我们需要访问存储权限,以便您可以选择并上传音频文件。", - permanentDenialText: "检测到您已永久拒绝存储权限。如需继续使用此功能,请前往应用设置中手动开启存储权限。", + permissionName: 'storagePermission'.tr, + explanationText: 'storagePermissionExplanation'.tr, + permanentDenialText: 'storagePermissionPermanentDenial'.tr, ); if (granted) {