diff --git a/lib/modules/permissions/controllers/permissions_controller.dart b/lib/modules/permissions/controllers/permissions_controller.dart index 4034cb772..1c40d55a2 100644 --- a/lib/modules/permissions/controllers/permissions_controller.dart +++ b/lib/modules/permissions/controllers/permissions_controller.dart @@ -12,7 +12,7 @@ class PermissionsController extends GetxController { // 是否正在请求权限 final RxBool isRequestingPermission = false.obs; - + // Android版本信息(用于权限组显示判断) final RxInt androidSdkVersion = 0.obs; @@ -22,7 +22,7 @@ class PermissionsController extends GetxController { _initAndroidVersion(); checkAllPermissions(); } - + /// 初始化Android版本信息 Future _initAndroidVersion() async { if (Platform.isAndroid) { @@ -36,7 +36,7 @@ class PermissionsController extends GetxController { } } } - + /// 检查是否应该显示蓝牙权限组 bool shouldShowBluetoothPermissions() { if (Platform.isAndroid) { @@ -48,7 +48,7 @@ class PermissionsController extends GetxController { } return false; } - + /// 检查是否应该显示存储权限组 bool shouldShowStoragePermissions() { if (Platform.isAndroid) { @@ -109,22 +109,22 @@ class PermissionsController extends GetxController { /// 获取平台特定的权限列表 Future> _getPlatformPermissions() async { final bluetoothPermissions = await _getBluetoothPermissions(); - + if (Platform.isIOS) { final List permissions = [ Permission.calendarFullAccess, Permission.location, Permission.contacts, - ...bluetoothPermissions, + //...bluetoothPermissions, Permission.notification, Permission.microphone, ]; - + // iOS系统不添加存储权限(根据shouldShowStoragePermissions方法) if (shouldShowStoragePermissions()) { permissions.add(Permission.storage); } - + return permissions; } else if (Platform.isAndroid) { final List permissions = [ @@ -138,12 +138,12 @@ class PermissionsController extends GetxController { Permission.scheduleExactAlarm, Permission.microphone, ]; - + // 只在Android 10及以下版本添加存储权限 if (shouldShowStoragePermissions()) { permissions.add(Permission.storage); } - + return permissions; } return []; diff --git a/lib/modules/permissions/models/permission_group.dart b/lib/modules/permissions/models/permission_group.dart index 99a27ae43..5426a7336 100644 --- a/lib/modules/permissions/models/permission_group.dart +++ b/lib/modules/permissions/models/permission_group.dart @@ -1,5 +1,7 @@ +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:device_info_plus/device_info_plus.dart'; class PermissionGroup { final String titleKey; @@ -12,7 +14,37 @@ class PermissionGroup { required this.permissions, }); - static List getPlatformGroups() { + /// 获取蓝牙权限列表(根据平台和Android版本) + static Future> _getBluetoothPermissions() async { + if (Platform.isAndroid) { + try { + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + // Android 12+ (API 31+) 使用新的蓝牙权限 + if (androidInfo.version.sdkInt >= 31) { + return [ + Permission.bluetoothScan, + Permission.bluetoothConnect, + ]; + } + // Android 12以下不显示蓝牙权限(因为会自动授予) + return []; + } catch (e) { + print('获取Android版本信息失败: $e'); + return []; + } + } else if (Platform.isIOS) { + // iOS使用基本蓝牙权限 + return [Permission.bluetooth]; + } + return []; + } + + /// 获取平台特定的权限组列表(异步方法) + static Future> getPlatformGroups() async { + // 动态获取蓝牙权限列表 + final bluetoothPermissions = await _getBluetoothPermissions(); + return [ // 通讯权限组 - 仅Android(包含联系人权限) const PermissionGroup( @@ -20,11 +52,11 @@ class PermissionGroup { icon: Icons.phone_android, permissions: [Permission.phone, Permission.sms, Permission.contacts], ), - // 蓝牙权限组 - Android 12+ - const PermissionGroup( + // 蓝牙权限组 - 根据平台动态获取权限 + PermissionGroup( titleKey: 'bluetoothPermissions', icon: Icons.bluetooth, - permissions: [Permission.bluetoothScan, Permission.bluetoothConnect], + permissions: bluetoothPermissions, ), // 通知权限组 const PermissionGroup( diff --git a/lib/modules/permissions/views/permissions_view.dart b/lib/modules/permissions/views/permissions_view.dart index 8022d8a2c..94d188ff2 100644 --- a/lib/modules/permissions/views/permissions_view.dart +++ b/lib/modules/permissions/views/permissions_view.dart @@ -46,39 +46,52 @@ class PermissionsView extends GetView { return RefreshIndicator( onRefresh: controller.checkAllPermissions, - child: ListView( + child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), - children: _buildPermissionGroups(isDarkMode), + child: _buildPermissionGroups(isDarkMode), ), ); }), ); } - List _buildPermissionGroups(bool isDarkMode) { - final groups = PermissionGroup.getPlatformGroups(); - final List widgets = []; - - for (int i = 0; i < groups.length; i++) { - final group = groups[i]; - - // 过滤平台特定权限 - if (_shouldShowGroup(group)) { - widgets.add(_buildPermissionSection( - group.titleKey, - group.icon, - group.permissions, - controller.permissionStatuses, - isDarkMode, - )); + Widget _buildPermissionGroups(bool isDarkMode) { + return FutureBuilder>( + future: PermissionGroup.getPlatformGroups(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } - if (i < groups.length - 1) { - widgets.add(SizedBox(height: 20.h)); + if (snapshot.hasError) { + return Center(child: Text('加载权限组失败: ${snapshot.error}')); } - } - } + + final groups = snapshot.data ?? []; + final List widgets = []; - return widgets; + for (int i = 0; i < groups.length; i++) { + final group = groups[i]; + + // 过滤平台特定权限 + if (_shouldShowGroup(group)) { + widgets.add(_buildPermissionSection( + group.titleKey, + group.icon, + group.permissions, + controller.permissionStatuses, + isDarkMode, + )); + + if (i < groups.length - 1) { + widgets.add(SizedBox(height: 20.h)); + } + } + } + + return Column(children: widgets); + }, + ); } bool _shouldShowGroup(PermissionGroup group) {