import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/tools/storage.dart'; import '../../tools/bugly/bugly_tool.dart'; class PermissionDialog { static Map titles = { Permission.camera: '相机'.tr, Permission.photos: '相册'.tr, Permission.storage: '读写'.tr, Permission.location: '定位'.tr, Permission.bluetooth: '蓝牙'.tr, Permission.bluetoothScan: '蓝牙'.tr, Permission.bluetoothConnect: '蓝牙'.tr, }; static Map contents = { Permission.camera: '需要访问相机权限才能拍照上传文件例如头像上传'.tr, Permission.photos: '需要访问相机权限才能使用相册图片上传文件上传头像'.tr, Permission.storage: '需要访问读写权限才能使用本地图片上传头像'.tr, Permission.location: '需要访问定位权限才能使用添加钥匙功能的位置信息'.tr, Permission.bluetooth: '需要访问蓝牙权限才能使用添加钥匙功能的位置信息'.tr, Permission.bluetoothScan: '需要访问蓝牙权限才能使用添加钥匙功能的位置信息'.tr, Permission.bluetoothConnect: '需要访问蓝牙权限才能使用添加钥匙功能的位置信息'.tr, }; static Future requestBluetooth() async { if (Get.context == null) { return false; } bool application = true; final List permissions = [ Permission.bluetooth, Permission.bluetoothScan, Permission.bluetoothConnect, ]; Future getPermissionStatus(List permissions) async { bool isGranted = true; final List permissionStatus = []; for (final Permission per in permissions) { permissionStatus.add(await per.status); } for (final PermissionStatus per in permissionStatus) { isGranted = isGranted && per.isGranted; } if (GetPlatform.isIOS) { isGranted = permissionStatus[0].isGranted; } return isGranted; } const Permission permission = Permission.bluetoothScan; final dynamic cache = await Storage.getString(titles[permission]!); final bool isGranted = await getPermissionStatus(permissions); if (GetPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text(contents[permission] ?? ''), actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: true); }, ), ], )); }, ); if (application) { await Storage.setString(titles[permission]!, titles[permission]); } } else if (cache is! String) { await Storage.setString(titles[permission]!, titles[permission]); } else { final bool isGranted = await getPermissionStatus(permissions); if (!isGranted) { showSet(permission); return false; } } if (application) { await permissions.request(); final bool isGranted = await getPermissionStatus(permissions); return isGranted; } return false; } //相册 static Future requestPhotos() async { if (Get.context == null) { return false; } final bool isAndroid33 = AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33; //通用的局部函数 List requestPermission() { List permissions; if (isAndroid33) { permissions = [ Permission.mediaLibrary, Permission.photos, Permission.videos, ]; } else { permissions = [ Permission.storage, ]; } return permissions; } Future permissionStatus(List permissions) async { bool isGranted = true; for (final Permission permission in permissions) { isGranted = isGranted && (await permission.status) == PermissionStatus.granted; } if (isAndroid33) { // android 33以上需要申请媒体库权限 isGranted = (await Permission.mediaLibrary.status) == PermissionStatus.granted; } return isGranted; } bool application = true; const Permission permission = Permission.photos; final List permissions = requestPermission(); final dynamic cache = await Storage.getString(titles[permission]??''); final bool isGranted = await permissionStatus(permissions); if (AppPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text(contents[permission] ?? ''), actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { Get.back(result: true); }, ), ], )); }, ); if (application) { await Storage.setString(titles[permission]!, titles[permission]); } } else if (cache is String) { final bool isDenied = !(await permissionStatus(permissions)); if (isDenied) { showSet(permission); return false; } } if (application) { final Map statuses = await permissions.request(); final bool isGranted = await permissionStatus(statuses.keys.toList()); return isGranted; } return false; } //读写 static Future requestStorage() async { if (Get.context == null) { return false; } final bool isAndroid33 = AppPlatform.isAndroid && AppPlatform.getSdkIntValue() >= 33; //通用的局部函数 List requestPermission() { List permissions; if (isAndroid33) { permissions = [ Permission.mediaLibrary, Permission.photos, // Permission.audio, Permission.videos, Permission.manageExternalStorage, ]; } else { permissions = [ Permission.storage, ]; } return permissions; } Future permissionStatus(List permissions) async { bool isGranted = true; for (final Permission permission in permissions) { isGranted = isGranted && (await permission.status) == PermissionStatus.granted; } if (isAndroid33) { // android 33以上需要申请媒体库权限 isGranted = (await Permission.mediaLibrary.status) == PermissionStatus.granted || (await Permission.manageExternalStorage.status) == PermissionStatus.granted; } return isGranted; } bool application = true; const Permission permission = Permission.storage; final List permissions = requestPermission(); final dynamic cache = await Storage.getString(titles[permission]??''); final bool isGranted = await permissionStatus(permissions); if (AppPlatform.isAndroid && !isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text('需要访问读写权限才能使用手动升级固件'.tr), actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { Get.back(result: true); }, ), ], )); }, ); if (application) { await Storage.setString(titles[permission]??'', titles[permission]); } } else if (cache is String) { final bool isDenied = !(await permissionStatus(permissions)); if (isDenied) { showSet(permission); return false; } } if (application) { final Map statuses = await permissions.request(); final bool isGranted = await permissionStatus(statuses.keys.toList()); return isGranted; } return false; } //显示权限判断申请框 static Future request(Permission permission, [String? content]) async { AppLog.log('context:$content'); if (Get.context == null) { return false; } bool application = true; final PermissionStatus status = await permission.status; final dynamic cache = await Storage.getString(titles[permission]??''); if (AppPlatform.isAndroid && !status.isGranted && cache is! String) { application = await showCupertinoDialog( context: Get.context!, builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'), content: Text(content ?? contents[permission] ?? ''), actions: [ CupertinoDialogAction( child: Text('不允许'.tr), onPressed: () { BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "不允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: false); }, ), CupertinoDialogAction( child: Text('允许'.tr), onPressed: () { BuglyTool.uploadExceptionWithEvent(eventStr: '${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}', detail: "允许'${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr} titles:$titles'"); Get.back(result: true); }, ), ], )); }, ); if (application) { await Storage.setString(titles[permission]??'', titles[permission]); } } else if (cache is String) { if (status.isDenied) { showSet(permission); return false; } } if (application) { final PermissionStatus status = await permission.request(); return status.isGranted; } return false; } //显示设置页面 static Future showSet(Permission permission) async { if (Get.context == null) { return; } showCupertinoDialog( context: Get.context!, builder: (BuildContext context) { return PopScope( canPop: false, child: CupertinoAlertDialog( title: Text('${titles[permission] ?? ''}${'权限被拒绝'.tr}'), content: Text( '${contents[permission] ?? ''},${'请手动在系统设置中开启'.tr}${titles[permission]}${'权限以继续使用应用'.tr}'), actions: [ CupertinoDialogAction( child: Text('去设置'.tr), onPressed: () { Get.back(); // 关闭对话框 openAppSettings(); // 打开系统设置页面 }, ), ], )); }, ); } }