permission_manager.dart 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. import 'package:permission_handler/permission_handler.dart';
  2. import 'package:device_info_plus/device_info_plus.dart';
  3. import 'dart:io';
  4. import 'log/logger.dart';
  5. class PermissionManager {
  6. /// 检查是否需要请求存储权限
  7. static Future<bool> _needsStoragePermission() async {
  8. if (!Platform.isAndroid) return false;
  9. try {
  10. final androidInfo = await DeviceInfoPlugin().androidInfo;
  11. // Android 10 是 API 29,所以 API 28 及以下是 Android 9 及以下
  12. return androidInfo.version.sdkInt <= 29;
  13. } catch (e) {
  14. log('PermissionManager', 'Error checking Android version: $e');
  15. return false;
  16. }
  17. }
  18. /// 请求存储权限
  19. static Future<bool> requestStoragePermission() async {
  20. // 检查是否需要请求权限
  21. if (!await _needsStoragePermission()) {
  22. return true;
  23. }
  24. try {
  25. var status = await Permission.storage.status;
  26. if (status.isGranted) {
  27. return true;
  28. }
  29. if (status.isPermanentlyDenied) {
  30. // await openAppSettings();
  31. return false;
  32. }
  33. status = await Permission.storage.request();
  34. return status.isGranted;
  35. } catch (e) {
  36. log('PermissionManager', 'Error requesting storage permission: $e');
  37. return false;
  38. }
  39. }
  40. /// 检查存储权限
  41. static Future<bool> checkStoragePermission() async {
  42. // 检查是否需要请求权限
  43. if (!await _needsStoragePermission()) {
  44. return true;
  45. }
  46. try {
  47. final status = await Permission.storage.status;
  48. return status.isGranted;
  49. } catch (e) {
  50. log('PermissionManager', 'Error checking storage permission: $e');
  51. return false;
  52. }
  53. }
  54. // ============== 通知权限管理 ==============
  55. /// 检查通知权限状态
  56. static Future<PermissionStatus> checkNotificationPermission() async {
  57. try {
  58. return await Permission.notification.status;
  59. } catch (e) {
  60. log('PermissionManager', 'Error checking notification permission: $e');
  61. return PermissionStatus.denied;
  62. }
  63. }
  64. /// 检查通知权限是否已授予
  65. static Future<bool> isNotificationPermissionGranted() async {
  66. try {
  67. final status = await Permission.notification.status;
  68. return status.isGranted;
  69. } catch (e) {
  70. log('PermissionManager', 'Error checking notification permission: $e');
  71. return false;
  72. }
  73. }
  74. /// 请求通知权限
  75. /// 返回 true 表示已授予权限,false 表示被拒绝
  76. static Future<bool> requestNotificationPermission() async {
  77. try {
  78. var status = await Permission.notification.status;
  79. // 如果已经授予,直接返回
  80. if (status.isGranted) {
  81. log('PermissionManager', 'Notification permission already granted');
  82. return true;
  83. }
  84. // 如果被永久拒绝,引导用户到设置页面
  85. if (status.isPermanentlyDenied) {
  86. log(
  87. 'PermissionManager',
  88. 'Notification permission permanently denied, opening settings',
  89. );
  90. await openAppSettings();
  91. return false;
  92. }
  93. // 请求权限
  94. log('PermissionManager', 'Requesting notification permission');
  95. status = await Permission.notification.request();
  96. final granted = status.isGranted;
  97. log(
  98. 'PermissionManager',
  99. 'Notification permission request result: $granted',
  100. );
  101. return granted;
  102. } catch (e) {
  103. log('PermissionManager', 'Error requesting notification permission: $e');
  104. return false;
  105. }
  106. }
  107. /// 检查通知权限是否被永久拒绝
  108. static Future<bool> isNotificationPermissionPermanentlyDenied() async {
  109. try {
  110. final status = await Permission.notification.status;
  111. return status.isPermanentlyDenied;
  112. } catch (e) {
  113. log('PermissionManager', 'Error checking notification permission: $e');
  114. return false;
  115. }
  116. }
  117. /// 打开应用设置页面
  118. static Future<bool> openNotificationSettings() async {
  119. try {
  120. log(
  121. 'PermissionManager',
  122. 'Opening app settings for notification permission',
  123. );
  124. return await openAppSettings();
  125. } catch (e) {
  126. log('PermissionManager', 'Error opening app settings: $e');
  127. return false;
  128. }
  129. }
  130. /// 获取通知权限的详细状态
  131. static Future<NotificationPermissionInfo>
  132. getNotificationPermissionInfo() async {
  133. try {
  134. final status = await Permission.notification.status;
  135. return NotificationPermissionInfo(
  136. isGranted: status.isGranted,
  137. isDenied: status.isDenied,
  138. isPermanentlyDenied: status.isPermanentlyDenied,
  139. isRestricted: status.isRestricted,
  140. isLimited: status.isLimited,
  141. canRequest: !status.isPermanentlyDenied && !status.isGranted,
  142. );
  143. } catch (e) {
  144. log(
  145. 'PermissionManager',
  146. 'Error getting notification permission info: $e',
  147. );
  148. return NotificationPermissionInfo(
  149. isGranted: false,
  150. isDenied: true,
  151. isPermanentlyDenied: false,
  152. isRestricted: false,
  153. isLimited: false,
  154. canRequest: true,
  155. );
  156. }
  157. }
  158. }
  159. /// 通知权限信息类
  160. class NotificationPermissionInfo {
  161. /// 是否已授予
  162. final bool isGranted;
  163. /// 是否被拒绝
  164. final bool isDenied;
  165. /// 是否被永久拒绝
  166. final bool isPermanentlyDenied;
  167. /// 是否受限制(iOS)
  168. final bool isRestricted;
  169. /// 是否为有限权限(iOS)
  170. final bool isLimited;
  171. /// 是否可以请求
  172. final bool canRequest;
  173. NotificationPermissionInfo({
  174. required this.isGranted,
  175. required this.isDenied,
  176. required this.isPermanentlyDenied,
  177. required this.isRestricted,
  178. required this.isLimited,
  179. required this.canRequest,
  180. });
  181. @override
  182. String toString() {
  183. return 'NotificationPermissionInfo(isGranted: $isGranted, isDenied: $isDenied, '
  184. 'isPermanentlyDenied: $isPermanentlyDenied, isRestricted: $isRestricted, '
  185. 'isLimited: $isLimited, canRequest: $canRequest)';
  186. }
  187. }