Browse Source

feat(配对控制器): 添加华为设备特殊处理:华为设备首次检查权限被拒绝后续不再触发权限申请,直接提示手动开启权限;

其它品牌设备不变
newdev_shunjiawei
lxm 1 year ago
parent
commit
f688de9b58
  1. 44
      lib/modules/pairing/controllers/pairing_controller.dart

44
lib/modules/pairing/controllers/pairing_controller.dart

@ -1,20 +1,25 @@
import 'dart:io';
import 'dart:async';
import 'package:app_settings/app_settings.dart'; import 'package:app_settings/app_settings.dart';
import 'package:voitrans/data/models/appconfig_model.dart'; import 'package:voitrans/data/models/appconfig_model.dart';
import '/data/models/appconfig.dart';
import '/data/models/user_Info.dart';
import '/data/services/network/api.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'dart:async';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:get_storage/get_storage.dart';
import 'package:device_info_plus/device_info_plus.dart';
import '../../../routes/app_routes.dart'; import '../../../routes/app_routes.dart';
import '../../../core/utils/logger.dart'; import '../../../core/utils/logger.dart';
import 'dart:io'; import '/data/models/appconfig.dart';
import '/data/models/user_Info.dart';
import '/data/services/network/api.dart';
import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/bluetooth_manager.dart';
import '../../../data/services/ble_manager.dart'; import '../../../data/services/ble_manager.dart';
import '../../../core/utils/permission_util.dart'; import '../../../core/utils/permission_util.dart';
import '../../../data/services/version_update_service.dart';
/// 配对状态枚举 - 简化版本 /// 配对状态枚举 - 简化版本
enum PairingState { enum PairingState {
@ -48,6 +53,7 @@ enum ErrorType {
class PairingController extends GetxController with WidgetsBindingObserver { class PairingController extends GetxController with WidgetsBindingObserver {
static const String _tag = 'PairingCtrl'; static const String _tag = 'PairingCtrl';
static PairingController get to => Get.find(); static PairingController get to => Get.find();
final _storage = GetStorage();
// ========== 状态管理 ========== // ========== 状态管理 ==========
final _currentState = PairingState.idle.obs; final _currentState = PairingState.idle.obs;
@ -96,6 +102,12 @@ class PairingController extends GetxController with WidgetsBindingObserver {
// Public getter for view access // Public getter for view access
BluetoothDevice? get currentDevice => _currentClassicDevice; BluetoothDevice? get currentDevice => _currentClassicDevice;
//华为设备权限检查标记
bool isHuaweiHasChecked = false;
// 缓存的设备品牌信息
final versionService = Get.find<VersionUpdateService>();
bool isHuaweiDevice = false;
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
@ -106,6 +118,8 @@ class PairingController extends GetxController with WidgetsBindingObserver {
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
Logger.i(_tag, '应用生命周期监听器注册完成'); Logger.i(_tag, '应用生命周期监听器注册完成');
isHuaweiDevice = _isHuaweiDevice();
// 确保服务已初始化 // 确保服务已初始化
_bluetoothManager = Get.find<BluetoothManager>(); _bluetoothManager = Get.find<BluetoothManager>();
_bleManager = Get.find<BleManager>(); _bleManager = Get.find<BleManager>();
@ -113,6 +127,11 @@ class PairingController extends GetxController with WidgetsBindingObserver {
// 集中设置所有监听器 // 集中设置所有监听器
_setupAllListeners(); _setupAllListeners();
if (isHuaweiDevice) {
//检查华为设备是否检查权限检查过
isHuaweiHasChecked = _storage.read('isHuaweiHasChecked') ?? false;
}
// 开始初始状态检查 // 开始初始状态检查
// 延迟稍长时间,确保BluetoothManager有足够时间获取已连接设备 // 延迟稍长时间,确保BluetoothManager有足够时间获取已连接设备
Future.delayed(const Duration(milliseconds: 300), () { Future.delayed(const Duration(milliseconds: 300), () {
@ -548,8 +567,20 @@ class PairingController extends GetxController with WidgetsBindingObserver {
return _bluetoothManager.bluetoothState != 'off'; return _bluetoothManager.bluetoothState != 'off';
} }
/// 检查是否为华为设备
bool _isHuaweiDevice() {
final deviceBrand = versionService.cachedDeviceBrand;
return deviceBrand.isNotEmpty &&
(deviceBrand.contains('huawei') || deviceBrand.contains('华为'));
}
/// 检查权限 /// 检查权限
Future<bool> _checkPermissions() async { Future<bool> _checkPermissions() async {
//如果是华为设备,且已经检查过,直接返回false
if (isHuaweiDevice && isHuaweiHasChecked) {
return false;
}
// Android权限检查 // Android权限检查
if (Platform.isAndroid) { if (Platform.isAndroid) {
Logger.i(_tag, '开始检查Android权限'); Logger.i(_tag, '开始检查Android权限');
@ -575,6 +606,9 @@ class PairingController extends GetxController with WidgetsBindingObserver {
permanentDenialText: 'locationPermanentDenial'.tr, permanentDenialText: 'locationPermanentDenial'.tr,
); );
if (isHuaweiDevice) {
_storage.write('isHuaweiHasChecked', true);
}
return bluetoothScanGranted && bluetoothConnectGranted && locationGranted; return bluetoothScanGranted && bluetoothConnectGranted && locationGranted;
} }
return true; return true;

Loading…
Cancel
Save