Browse Source

feat(权限): 添加Android 12+蓝牙权限和版本适配逻辑

添加蓝牙扫描和连接权限支持Android 12+设备
根据Android版本动态显示存储和蓝牙权限组
更新权限控制器以处理不同版本的权限请求
newdev_shunjiawei
lxm 1 year ago
parent
commit
710c9cc98f
  1. 4
      android/app/src/main/AndroidManifest.xml
  2. 6
      lib/core/translations/language/en_us.dart
  3. 4
      lib/core/translations/language/zh_cn.dart
  4. 19
      lib/modules/meeting/controllers/meeting_home_controller.dart
  5. 114
      lib/modules/permissions/controllers/permissions_controller.dart
  6. 4
      lib/modules/permissions/models/permission_group.dart
  7. 15
      lib/modules/permissions/views/permissions_view.dart

4
android/app/src/main/AndroidManifest.xml

@ -28,6 +28,10 @@
<!-- 添加Android 11+的存储权限 -->
<!-- <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" /> -->
<!-- Android 13+ 媒体权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<!-- 添加悬浮窗权限,可能有助于解决前台服务启动问题 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

6
lib/core/translations/language/en_us.dart

@ -532,6 +532,12 @@ const Map<String, String> 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',

4
lib/core/translations/language/zh_cn.dart

@ -495,6 +495,10 @@ const Map<String, String> zhCN = {
'contactsPermissionDetailDesc': '拨打电话和发送短信功能需要联系人权限以选择联系人',
'bluetoothPermissionDesc': '用于连接和管理蓝牙设备',
'bluetoothPermissionDetailDesc': '连接蓝牙耳机等设备需要蓝牙权限',
'bluetoothScanPermissionDesc': '用于扫描附近的蓝牙设备',
'bluetoothScanPermissionDetailDesc': '扫描附近蓝牙设备需要蓝牙扫描权限',
'bluetoothConnectPermissionDesc': '用于连接蓝牙设备',
'bluetoothConnectPermissionDetailDesc': '连接蓝牙设备需要蓝牙连接权限',
'notificationPermissionDesc': '用于发送通知消息',
'notificationPermissionDetailDesc': '应用需要通知权限以向您发送重要提醒和消息',
'appNeedsPermissionForFullFunction': '应用需要此权限以提供完整功能',

19
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,

114
lib/modules/permissions/controllers/permissions_controller.dart

@ -2,6 +2,7 @@ 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 {
@ -12,22 +13,63 @@ class PermissionsController extends GetxController {
// 是否正在请求权限
final RxBool isRequestingPermission = false.obs;
// Android版本信息(用于权限组显示判断)
final RxInt androidSdkVersion = 0.obs;
@override
void onInit() {
super.onInit();
_initAndroidVersion();
checkAllPermissions();
}
/// 初始化Android版本信息
Future<void> _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<Map<Permission, PermissionStatus>> checkAllPermissions() async {
final Map<Permission, PermissionStatus> 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;
@ -38,31 +80,71 @@ class PermissionsController extends GetxController {
return statuses;
}
/// 获取蓝牙权限列表(根据Android版本)
Future<List<Permission>> _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<Permission> _getPlatformPermissions() {
Future<List<Permission>> _getPlatformPermissions() async {
final bluetoothPermissions = await _getBluetoothPermissions();
if (Platform.isIOS) {
return [
final List<Permission> 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<Permission> 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 [];
}
@ -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,
);
@ -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:

4
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(

15
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<PermissionsController> {
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;
}

Loading…
Cancel
Save