From 53631fe3cc411c8d8ae120d86d7a52da911891aa Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 16 Aug 2025 15:10:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=9D=83=E9=99=90):=20=E6=B7=BB=E5=8A=A0A?= =?UTF-8?q?ndroid=2012+=E8=93=9D=E7=89=99=E6=9D=83=E9=99=90=E5=92=8C?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E9=80=82=E9=85=8D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加蓝牙扫描和连接权限支持Android 12+设备 根据Android版本动态显示存储和蓝牙权限组 更新权限控制器以处理不同版本的权限请求 --- android/app/src/main/AndroidManifest.xml | 4 + lib/core/translations/language/en_us.dart | 6 + lib/core/translations/language/zh_cn.dart | 4 + .../controllers/meeting_home_controller.dart | 19 +++ .../controllers/permissions_controller.dart | 130 +++++++++++++++--- .../permissions/models/permission_group.dart | 6 +- .../permissions/views/permissions_view.dart | 15 +- 7 files changed, 159 insertions(+), 25 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ceba71e9f..7d244c60a 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -28,6 +28,10 @@ + + + + diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index a0ef8f942..1ea125f22 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -532,6 +532,12 @@ const Map enUS = { 'Used for connecting and managing Bluetooth devices', 'bluetoothPermissionDetailDesc': 'Connecting to Bluetooth headphones and other devices requires Bluetooth permission', + 'bluetoothScanPermissionDesc': 'Used for scanning nearby Bluetooth devices', + 'bluetoothScanPermissionDetailDesc': + 'Scanning for nearby Bluetooth devices requires Bluetooth scan permission', + 'bluetoothConnectPermissionDesc': 'Used for connecting to Bluetooth devices', + 'bluetoothConnectPermissionDetailDesc': + 'Connecting to Bluetooth devices requires Bluetooth connect permission', 'notificationPermissionDesc': 'Used for sending notification messages', 'notificationPermissionDetailDesc': 'App needs notification permission to send you important alerts and messages', diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 3006dbb9a..f52ebd4ab 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -495,6 +495,10 @@ const Map zhCN = { 'contactsPermissionDetailDesc': '拨打电话和发送短信功能需要联系人权限以选择联系人', 'bluetoothPermissionDesc': '用于连接和管理蓝牙设备', 'bluetoothPermissionDetailDesc': '连接蓝牙耳机等设备需要蓝牙权限', + 'bluetoothScanPermissionDesc': '用于扫描附近的蓝牙设备', + 'bluetoothScanPermissionDetailDesc': '扫描附近蓝牙设备需要蓝牙扫描权限', + 'bluetoothConnectPermissionDesc': '用于连接蓝牙设备', + 'bluetoothConnectPermissionDetailDesc': '连接蓝牙设备需要蓝牙连接权限', 'notificationPermissionDesc': '用于发送通知消息', 'notificationPermissionDetailDesc': '应用需要通知权限以向您发送重要提醒和消息', 'appNeedsPermissionForFullFunction': '应用需要此权限以提供完整功能', diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index 1b5af2369..e994d5025 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -88,6 +89,24 @@ class MeetingHomeController extends GetxController { // 请求存储权限 void _requestStoragePermission() async { + // 只在Android 10及以下版本请求存储权限 + if (Platform.isAndroid) { + try { + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + final sdkVersion = androidInfo.version.sdkInt; + + // Android 11+ (API 30+) 不需要存储权限 + if (sdkVersion >= 30) { + Logger.d("Permission", "Android 11+版本,无需请求存储权限"); + return; + } + } catch (e) { + Logger.e("Permission", "获取Android版本信息失败: $e"); + // 如果获取版本失败,为了兼容性还是请求权限 + } + } + PermissionUtil.instance .requestPermission( permissionType: Permission.storage, diff --git a/lib/modules/permissions/controllers/permissions_controller.dart b/lib/modules/permissions/controllers/permissions_controller.dart index fc483dfbe..4034cb772 100644 --- a/lib/modules/permissions/controllers/permissions_controller.dart +++ b/lib/modules/permissions/controllers/permissions_controller.dart @@ -2,67 +2,149 @@ import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:flutter/material.dart'; import 'dart:io' show Platform; +import 'package:device_info_plus/device_info_plus.dart'; import '../../../core/utils/permission_util.dart'; class PermissionsController extends GetxController { // 权限状态映射 - final RxMap permissionStatuses = + final RxMap permissionStatuses = {}.obs; // 是否正在请求权限 final RxBool isRequestingPermission = false.obs; + + // Android版本信息(用于权限组显示判断) + final RxInt androidSdkVersion = 0.obs; @override void onInit() { super.onInit(); + _initAndroidVersion(); checkAllPermissions(); } + + /// 初始化Android版本信息 + Future _initAndroidVersion() async { + if (Platform.isAndroid) { + try { + final deviceInfo = DeviceInfoPlugin(); + final androidInfo = await deviceInfo.androidInfo; + androidSdkVersion.value = androidInfo.version.sdkInt; + } catch (e) { + print('获取Android版本信息失败: $e'); + androidSdkVersion.value = 0; + } + } + } + + /// 检查是否应该显示蓝牙权限组 + bool shouldShowBluetoothPermissions() { + if (Platform.isAndroid) { + // Android 12+ (API 31+) 才显示蓝牙权限组 + return androidSdkVersion.value >= 31; + } else if (Platform.isIOS) { + // iOS显示蓝牙权限组 + return true; + } + return false; + } + + /// 检查是否应该显示存储权限组 + bool shouldShowStoragePermissions() { + if (Platform.isAndroid) { + // Android 10及以下版本 (API 29及以下) 才显示存储权限组 + return androidSdkVersion.value <= 29 && androidSdkVersion.value > 0; + } + // iOS系统不显示存储权限组 + return false; + } /// 检查所有权限状态 Future> checkAllPermissions() async { final Map statuses = {}; - + // 根据平台获取需要检查的权限列表 - final permissions = _getPlatformPermissions(); - + final permissions = await _getPlatformPermissions(); + for (final permission in permissions) { try { statuses[permission] = await permission.status; + print('Permission: $permission, Status: ${statuses[permission]}'); } catch (e) { // 某些权限在特定平台可能不支持,设置为拒绝状态 statuses[permission] = PermissionStatus.denied; } } - + permissionStatuses.value = statuses; return statuses; } + /// 获取蓝牙权限列表(根据Android版本) + 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 []; + } + /// 获取平台特定的权限列表 - List _getPlatformPermissions() { + Future> _getPlatformPermissions() async { + final bluetoothPermissions = await _getBluetoothPermissions(); + if (Platform.isIOS) { - return [ + final List permissions = [ Permission.calendarFullAccess, Permission.location, Permission.contacts, - Permission.bluetooth, + ...bluetoothPermissions, Permission.notification, - Permission.storage, Permission.microphone, ]; + + // iOS系统不添加存储权限(根据shouldShowStoragePermissions方法) + if (shouldShowStoragePermissions()) { + permissions.add(Permission.storage); + } + + return permissions; } else if (Platform.isAndroid) { - return [ + final List permissions = [ Permission.calendarFullAccess, Permission.location, Permission.phone, Permission.sms, Permission.contacts, - Permission.bluetooth, + ...bluetoothPermissions, Permission.notification, Permission.scheduleExactAlarm, - Permission.storage, Permission.microphone, ]; + + // 只在Android 10及以下版本添加存储权限 + if (shouldShowStoragePermissions()) { + permissions.add(Permission.storage); + } + + return permissions; } return []; } @@ -70,9 +152,9 @@ class PermissionsController extends GetxController { /// 请求单个权限 Future requestPermission(Permission permission) async { if (isRequestingPermission.value) return false; - + isRequestingPermission.value = true; - + try { final permissionName = getPermissionName(permission); final explanationText = _getDetailedDescription(permission); @@ -81,8 +163,8 @@ class PermissionsController extends GetxController { permissionType: permission, permissionName: permissionName, explanationText: explanationText, - permanentDenialText: 'permanentDenialText'.tr.replaceAll( - '{permission}', permissionName), + permanentDenialText: + 'permanentDenialText'.tr.replaceAll('{permission}', permissionName), settingsButtonText: 'goToSettings'.tr, cancelButtonText: 'cancel'.tr, ); @@ -93,7 +175,7 @@ class PermissionsController extends GetxController { // 刷新权限状态 await checkAllPermissions(); - + return hasPermission; } catch (e) { _showErrorMessage(); @@ -119,6 +201,10 @@ class PermissionsController extends GetxController { return 'contacts'.tr; case Permission.bluetooth: return 'bluetooth'.tr; + case Permission.bluetoothScan: + return 'bluetoothScan'.tr; + case Permission.bluetoothConnect: + return 'bluetoothConnect'.tr; case Permission.notification: return 'notification'.tr; case Permission.calendarWriteOnly: @@ -149,6 +235,10 @@ class PermissionsController extends GetxController { return 'contactsPermissionDetailDesc'.tr; case Permission.bluetooth: return 'bluetoothPermissionDetailDesc'.tr; + case Permission.bluetoothScan: + return 'bluetoothScanPermissionDetailDesc'.tr; + case Permission.bluetoothConnect: + return 'bluetoothConnectPermissionDetailDesc'.tr; case Permission.notification: return 'notificationPermissionDetailDesc'.tr; case Permission.calendarWriteOnly: @@ -179,6 +269,10 @@ class PermissionsController extends GetxController { return 'contactsPermissionDesc'.tr; case Permission.bluetooth: return 'bluetoothPermissionDesc'.tr; + case Permission.bluetoothScan: + return 'bluetoothScanPermissionDesc'.tr; + case Permission.bluetoothConnect: + return 'bluetoothConnectPermissionDesc'.tr; case Permission.notification: return 'notificationPermissionDesc'.tr; case Permission.calendarWriteOnly: @@ -219,4 +313,4 @@ class PermissionsController extends GetxController { colorText: Colors.white, ); } -} \ No newline at end of file +} diff --git a/lib/modules/permissions/models/permission_group.dart b/lib/modules/permissions/models/permission_group.dart index f5c6fb324..99a27ae43 100644 --- a/lib/modules/permissions/models/permission_group.dart +++ b/lib/modules/permissions/models/permission_group.dart @@ -20,11 +20,11 @@ class PermissionGroup { icon: Icons.phone_android, permissions: [Permission.phone, Permission.sms, Permission.contacts], ), - // 蓝牙权限组 + // 蓝牙权限组 - Android 12+ const PermissionGroup( titleKey: 'bluetoothPermissions', icon: Icons.bluetooth, - permissions: [Permission.bluetooth], + permissions: [Permission.bluetoothScan, Permission.bluetoothConnect], ), // 通知权限组 const PermissionGroup( @@ -64,4 +64,4 @@ class PermissionGroup { ), ]; } -} \ No newline at end of file +} diff --git a/lib/modules/permissions/views/permissions_view.dart b/lib/modules/permissions/views/permissions_view.dart index 23eb299b8..8022d8a2c 100644 --- a/lib/modules/permissions/views/permissions_view.dart +++ b/lib/modules/permissions/views/permissions_view.dart @@ -4,6 +4,7 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'dart:ui'; import 'dart:io' show Platform; +import 'package:device_info_plus/device_info_plus.dart'; import '../controllers/permissions_controller.dart'; import '../models/permission_group.dart'; @@ -86,10 +87,16 @@ class PermissionsView extends GetView { group.titleKey == 'alarmPermissions') { return Platform.isAndroid; } - // 蓝牙权限、通知权限、存储权限和麦克风权限在所有平台显示 - if (group.titleKey == 'bluetoothPermissions' || - group.titleKey == 'notificationPermissions' || - group.titleKey == 'storagePermissions' || + // 蓝牙权限组:Android 12+或iOS才显示 + if (group.titleKey == 'bluetoothPermissions') { + return controller.shouldShowBluetoothPermissions(); + } + // 存储权限组:Android 10及以下版本或iOS才显示 + if (group.titleKey == 'storagePermissions') { + return controller.shouldShowStoragePermissions(); + } + // 通知权限和麦克风权限在所有平台显示 + if (group.titleKey == 'notificationPermissions' || group.titleKey == 'microphonePermissions') { return true; }