permission_engine.dart 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import 'package:flutter/material.dart';
  2. import 'package:permission_handler/permission_handler.dart';
  3. import 'package:shared/utils/device_utils.dart';
  4. import 'package:shared/utils/log_utils.dart';
  5. import 'package:widgets/dialog/app_default_dialog.dart';
  6. import 'package:widgets/dialog/permission_desc_dialog.dart';
  7. import '../../channel/native_version_channel.dart';
  8. import '../dialog/dialog_engine.dart';
  9. /*
  10. * 动态权限的申请与校验
  11. */
  12. class PermissionEngine {
  13. // 私有构造函数
  14. PermissionEngine._privateConstructor();
  15. // 单例实例
  16. static final PermissionEngine _instance = PermissionEngine._privateConstructor();
  17. // 获取单例实例的访问点
  18. factory PermissionEngine() {
  19. return _instance;
  20. }
  21. /// 申请相机权限
  22. void requestCameraPermission(void Function() success) async {
  23. // 获取当前的权限
  24. var status = await Permission.camera.status;
  25. if (status.isGranted) {
  26. // 已经授权
  27. success();
  28. } else {
  29. // 未授权,则准备发起一次申请
  30. var permissionRequestFuture = Permission.camera.request();
  31. // 延迟500毫秒的Future
  32. var delayFuture = Future.delayed(const Duration(milliseconds: 500), () => 'delay');
  33. // 使用Future.any等待上述两个Future中的任何一个完成
  34. var firstCompleted = await Future.any([permissionRequestFuture, delayFuture]);
  35. // 判断响应结果
  36. if (firstCompleted == 'delay') {
  37. // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
  38. _showPermissionDialog(
  39. "“24IFM” requests to use your camera permission for functions such as taking avatars, uploading and saving images. Please allow me to obtain your permission");
  40. // 再次等待权限请求结果
  41. status = await permissionRequestFuture;
  42. DialogEngine.dismiss(tag: "permission");
  43. } else {
  44. // 权限请求已完成,立刻取消对话框展示(如果已经展示的话)
  45. DialogEngine.dismiss(tag: "permission");
  46. status = firstCompleted as PermissionStatus;
  47. }
  48. if (status.isGranted) {
  49. // 用户授权
  50. success();
  51. } else {
  52. // 权限被拒绝
  53. await DialogEngine.show(
  54. widget: AppDefaultDialog(
  55. message: "Please set the permission to open the camera on your phone",
  56. title: "Alert",
  57. confirmAction: () {
  58. openAppSettings();
  59. }),
  60. );
  61. }
  62. }
  63. }
  64. /// 校验并申请定位权限
  65. Future<bool> requestLocationPermission() async {
  66. // 获取当前的权限
  67. var status = await Permission.location.status;
  68. if (status.isGranted) {
  69. // 已经授权
  70. return true;
  71. } else {
  72. // 未授权,则准备发起一次申请
  73. var permissionRequestFuture = Permission.location.request();
  74. // 延迟500毫秒的Future
  75. var delayFuture = Future.delayed(const Duration(milliseconds: 500), () => 'delay');
  76. // 使用Future.any等待上述两个Future中的任何一个完成
  77. var firstCompleted = await Future.any([permissionRequestFuture, delayFuture]);
  78. // 判断响应结果
  79. if (firstCompleted == 'delay') {
  80. // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
  81. _showPermissionDialog("“24iFM” want to access your location permission to obtain your location and recommend nearby information");
  82. // 再次等待权限请求结果
  83. status = await permissionRequestFuture;
  84. DialogEngine.dismiss(tag: "permission");
  85. } else {
  86. Log.d("权限请求已完成,立刻取消对话框展示");
  87. // 权限请求已完成,立刻取消对话框展示(如果已经展示的话)
  88. DialogEngine.dismiss(tag: "permission");
  89. status = firstCompleted as PermissionStatus;
  90. }
  91. if (status.isGranted) {
  92. // 用户授权
  93. return true;
  94. } else {
  95. // 权限被拒绝
  96. await DialogEngine.show(
  97. widget: AppDefaultDialog(
  98. message: "Please go to your phone settings to enable location permission",
  99. title: "Alert",
  100. confirmAction: () {
  101. openAppSettings();
  102. }),
  103. );
  104. return false;
  105. }
  106. }
  107. }
  108. /// 申请拨打电话权限
  109. void requestCallPhonePermission(void Function() success) async {
  110. // 获取当前的权限
  111. var status = await Permission.phone.status;
  112. if (status.isGranted) {
  113. // 已经授权
  114. success();
  115. } else {
  116. // 未授权,则准备发起一次申请
  117. var permissionRequestFuture = Permission.phone.request();
  118. // 延迟500毫秒的Future
  119. var delayFuture = Future.delayed(const Duration(milliseconds: 500), () => 'delay');
  120. // 使用Future.any等待上述两个Future中的任何一个完成
  121. var firstCompleted = await Future.any([permissionRequestFuture, delayFuture]);
  122. // 判断响应结果
  123. if (firstCompleted == 'delay') {
  124. // 如果是延迟Future完成了,表示500毫秒内没有获得权限响应,显示对话框
  125. _showPermissionDialog("“24iFM”requires permission to make phone calls for communication. Please allow access to this permission");
  126. // 再次等待权限请求结果
  127. status = await permissionRequestFuture;
  128. DialogEngine.dismiss(tag: "permission");
  129. } else {
  130. // 权限请求已完成,立刻取消对话框展示(如果已经展示的话)
  131. DialogEngine.dismiss(tag: "permission");
  132. status = firstCompleted as PermissionStatus;
  133. }
  134. if (status.isGranted) {
  135. // 用户授权
  136. success();
  137. } else {
  138. // 权限被拒绝
  139. await DialogEngine.show(
  140. widget: AppDefaultDialog(
  141. message: "Please go to your phone settings to enable phone calls permission",
  142. title: "Alert",
  143. confirmAction: () {
  144. openAppSettings();
  145. }),
  146. );
  147. }
  148. }
  149. }
  150. //顶部展示权限声明详情弹窗
  151. void _showPermissionDialog(String desc) {
  152. DialogEngine.show(
  153. clickMaskDismiss: false,
  154. backDismiss: true,
  155. tag: "permission",
  156. maskColor: Colors.transparent,
  157. widget: PermissionDescDialog(desc),
  158. );
  159. }
  160. }