starwork_flutter/lib/base/app_permission.dart

202 lines
6.3 KiB
Dart
Raw Permalink Normal View History

2025-09-06 15:42:26 +08:00
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
class AppPermission {
// 检查权限
static Future<bool> checkPermission({required Permission permission}) async {
var status = await permission.status;
return status == PermissionStatus.granted;
}
// 批量检查权限
static Future<bool> checkPermissions({
required List<Permission> permissions,
}) async {
if (permissions.isEmpty) return false;
Map<Permission, PermissionStatus> statuses = await permissions.request();
for (var status in statuses.values) {
if (status != PermissionStatus.granted) {
return false;
}
}
return true;
}
2025-09-03 09:39:06 +08:00
static Future<bool> requestPermission({
required Permission permission,
}) async {
var status = await permission.request();
return status == PermissionStatus.granted;
}
static Future<bool> requestNotificationPermission() async {
final PermissionStatus status = await Permission.notification.request();
if (status == PermissionStatus.granted) {
print("通知权限已授予");
return true;
} else if (status == PermissionStatus.denied) {
// 第一次被拒绝,可以再次请求
return false;
} else if (status.isPermanentlyDenied) {
// 用户勾选了“不再提示”或被永久拒绝
print("权限被永久拒绝,跳转到设置页面");
openAppSettings(); // 跳转到应用设置页,手动开启
return false;
}
return false;
}
2025-09-06 15:42:26 +08:00
// 请求蓝牙权限Android 12及以上需要
static Future<bool> requestBluetoothPermissions() async {
try {
// Android 12及以上需要的蓝牙权限
2025-09-06 15:42:26 +08:00
List<Permission> bluetoothPermissions = [];
if (Platform.isAndroid) {
// Android 12+ 需要细分权限
if (Platform.version.startsWith('Android 12') || Platform.isAndroid) {
bluetoothPermissions = [
Permission.bluetoothScan,
Permission.bluetoothConnect,
Permission.bluetoothAdvertise,
];
} else {
// Android 11 及以下
bluetoothPermissions = [
Permission.bluetooth,
Permission.location, // 扫描 BLE 可能需要位置
];
}
} else if (Platform.isIOS) {
// iOS 只需要通用 bluetooth 权限
bluetoothPermissions = [
Permission.bluetooth,
];
}
// Android 12以下需要的位置权限
List<Permission> locationPermissions = [
Permission.location,
Permission.locationWhenInUse,
];
2025-09-06 15:42:26 +08:00
bool bluetoothGranted = true;
bool locationGranted = true;
2025-09-06 15:42:26 +08:00
// 检查并请求蓝牙权限Android 12+
Map<Permission, PermissionStatus> bluetoothStatuses = await bluetoothPermissions.request();
for (var status in bluetoothStatuses.values) {
if (status != PermissionStatus.granted) {
bluetoothGranted = false;
break;
}
}
2025-09-06 15:42:26 +08:00
// 检查并请求位置权限Android 12以下或蓝牙扫描需要
Map<Permission, PermissionStatus> locationStatuses = await locationPermissions.request();
for (var status in locationStatuses.values) {
if (status != PermissionStatus.granted) {
locationGranted = false;
break;
}
}
2025-09-06 15:42:26 +08:00
bool hasPermission = bluetoothGranted && locationGranted;
2025-09-06 15:42:26 +08:00
if (hasPermission) {
print("蓝牙权限已授予");
} else {
print("蓝牙权限被拒绝");
}
2025-09-06 15:42:26 +08:00
return hasPermission;
} catch (e) {
print("请求蓝牙权限失败: $e");
return false;
}
}
2025-09-06 15:42:26 +08:00
// 检查蓝牙扫描权限
static Future<bool> checkBluetoothScanPermission() async {
try {
var status = await Permission.bluetoothScan.status;
return status == PermissionStatus.granted;
} catch (e) {
// 如果权限不存在Android 12以下检查位置权限
return await checkLocationPermission();
}
}
2025-09-06 15:42:26 +08:00
// 检查蓝牙连接权限
static Future<bool> checkBluetoothConnectPermission() async {
try {
var status = await Permission.bluetoothConnect.status;
return status == PermissionStatus.granted;
} catch (e) {
// 如果权限不存在Android 12以下默认返回true
print("蓝牙连接权限检查失败可能是Android 12以下版本: $e");
return true;
}
}
2025-09-06 15:42:26 +08:00
// 检查蓝牙广播权限
static Future<bool> checkBluetoothAdvertisePermission() async {
try {
var status = await Permission.bluetoothAdvertise.status;
return status == PermissionStatus.granted;
} catch (e) {
// 如果权限不存在Android 12以下默认返回true
print("蓝牙广播权限检查失败可能是Android 12以下版本: $e");
return true;
}
}
2025-09-06 15:42:26 +08:00
// 检查位置权限Android 12以下蓝牙扫描需要
static Future<bool> checkLocationPermission() async {
var status = await Permission.location.status;
return status == PermissionStatus.granted;
}
2025-09-06 15:42:26 +08:00
// 请求位置权限
static Future<bool> requestLocationPermission() async {
try {
final PermissionStatus status = await Permission.location.request();
2025-09-06 15:42:26 +08:00
if (status == PermissionStatus.granted) {
print("位置权限已授予");
return true;
} else if (status == PermissionStatus.denied) {
print("位置权限被拒绝");
return false;
} else if (status.isPermanentlyDenied) {
print("位置权限被永久拒绝,跳转到设置页面");
return false;
}
2025-09-06 15:42:26 +08:00
return false;
} catch (e) {
print("请求位置权限失败: $e");
return false;
}
}
2025-09-06 15:42:26 +08:00
// 检查所有蓝牙相关权限
static Future<bool> checkAllBluetoothPermissions() async {
2025-09-06 15:42:26 +08:00
if (Platform.isIOS) {
// iOS主要检查位置权限蓝牙权限由系统自动处理
bool locationPermission = await checkLocationPermission();
return locationPermission;
} else {
// Android检查所有相关权限
bool scanPermission = await checkBluetoothScanPermission();
bool connectPermission = await checkBluetoothConnectPermission();
bool advertisePermission = await checkBluetoothAdvertisePermission();
bool locationPermission = await checkLocationPermission();
return scanPermission && connectPermission && advertisePermission && locationPermission;
}
}
}