permission_util.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'dart:io';
  2. import 'package:device_info_plus/device_info_plus.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:permission_handler/permission_handler.dart';
  5. /// @author: bo.zeng
  6. /// @email: cnhbwds@gmail.com
  7. /// @date: 2025 2025/4/10 13:30
  8. /// @description:
  9. class PermissionManager {
  10. /// 请求单个权限
  11. static Future<bool> request(Permission permission) async {
  12. final status = await permission.request();
  13. if (status.isGranted) return true;
  14. if (status.isPermanentlyDenied) {
  15. // 可选择引导用户去设置页面
  16. debugPrint('🚫 权限永久拒绝:${permission.toString()}');
  17. }
  18. return false;
  19. }
  20. /// 请求多个权限,返回是否全部通过
  21. static Future<bool> requestMultiple(List<Permission> permissions) async {
  22. final statuses = await permissions.request();
  23. // 判断是否全部 granted
  24. return statuses.values.every((status) => status.isGranted);
  25. }
  26. /// 检查权限是否已授权
  27. static Future<bool> isGranted(Permission permission) async {
  28. return await permission.isGranted;
  29. }
  30. /// 是否永久拒绝(无法再次请求,只能引导去设置)
  31. static Future<bool> isPermanentlyDenied(Permission permission) async {
  32. return await permission.isPermanentlyDenied;
  33. }
  34. /// 打开系统设置
  35. static Future<bool> openAppSettings() async {
  36. return await openAppSettings();
  37. }
  38. /// 请求权限并提示处理
  39. static Future<bool> ensurePermission(
  40. Permission permission, {
  41. VoidCallback? onPermanentlyDenied,
  42. }) async {
  43. final granted = await request(permission);
  44. if (!granted && await isPermanentlyDenied(permission)) {
  45. if (onPermanentlyDenied != null) {
  46. onPermanentlyDenied();
  47. } else {
  48. debugPrint('👉 引导用户前往设置页面');
  49. }
  50. }
  51. return granted;
  52. }
  53. // ============================ 常用权限组合封装 ============================
  54. /// 请求相机权限(包括相机 + 存储权限)
  55. static Future<bool> requestCameraPermission() async {
  56. List<Permission> permissions = [Permission.camera];
  57. if (Platform.isAndroid) {
  58. final androidInfo = await DeviceInfoPlugin().androidInfo;
  59. if (androidInfo.version.sdkInt >= 33) {
  60. permissions.add(Permission.photos);
  61. } else {
  62. permissions.add(Permission.storage);
  63. }
  64. }
  65. final statuses = await permissions.request();
  66. return statuses.values.every((status) => status.isGranted);
  67. }
  68. /// 请求定位权限(包括定位 + 存储权限)
  69. static Future<bool> requestLocationPermission() async {
  70. final granted = await requestMultiple([
  71. Permission.location,
  72. Permission.storage,
  73. ]);
  74. return granted;
  75. }
  76. /// 请求麦克风权限(包括麦克风 + 存储权限)
  77. static Future<bool> requestMicrophonePermission() async {
  78. final granted = await requestMultiple([
  79. Permission.microphone,
  80. Permission.storage,
  81. ]);
  82. return granted;
  83. }
  84. /// 请求照片权限(包括相册 + 存储权限)
  85. static Future<bool> requestPhotoPermission() async {
  86. final granted = await requestMultiple([
  87. Permission.photos,
  88. Permission.storage,
  89. ]);
  90. return granted;
  91. }
  92. /// 请求录音权限(包括麦克风 + 存储权限)
  93. static Future<bool> requestAudioPermission() async {
  94. final granted = await requestMultiple([
  95. Permission.microphone,
  96. Permission.storage,
  97. ]);
  98. return granted;
  99. }
  100. }