permissionRequestPage.dart
6.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';
import '../../utils/log_util.dart';
/// 权限检查及请求
/// 外部可通过此方法来进行权限的检查和请求,将自动跳转到`PermissionRequestPage`页面。
/// 传入 `Permission` 以及对应的权限名称 `permissionTypeStr`,如果有权限则返回 `Future true`
/// `isRequiredPermission` 如果为 `true`,则 "取消" 按钮将执行 "退出app" 的操作
Future<bool> permissionCheckAndRequest(
BuildContext context,
Permission permission,
String permissionTypeStr,
{bool isRequiredPermission = false}) async {
if (!await permission.status.isGranted) {
await Navigator.of(context).push(PageRouteBuilder(
opaque: false,
pageBuilder: ((context, animation, secondaryAnimation) {
return PermissionRequestPage(permission, permissionTypeStr,
isRequiredPermission: isRequiredPermission);
})));
} else {
return true;
}
return false;
}
class PermissionRequestPage extends StatefulWidget {
const PermissionRequestPage(this.permission, this.permissionTypeStr,
{super.key, this.isRequiredPermission = false});
final Permission permission;
final String permissionTypeStr;
final bool isRequiredPermission;
@override
State<PermissionRequestPage> createState() => _PermissionRequestPageState();
}
class _PermissionRequestPageState extends State<PermissionRequestPage>
with WidgetsBindingObserver {
bool _isGoSetting = false;
late final List<String> msgList;
bool _isDialogShowing = false;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
msgList = [
"${widget.permissionTypeStr}功能需要获取您设备的${widget.permissionTypeStr}权限,否则可能无法正常工作。\n是否申请${widget.permissionTypeStr}权限?",
"${widget.permissionTypeStr}权限不全,是否重新申请权限?",
"没有${widget.permissionTypeStr}权限,您可以手动开启权限",
widget.isRequiredPermission ? "退出应用" : "取消"
];
_checkPermission(widget.permission);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
Log.d("didChangeAppLifecycleState state=$state _isGoSetting=$_isGoSetting");
// 监听 app 从后台切回前台
if (state == AppLifecycleState.resumed && _isGoSetting) {
_checkPermission(widget.permission);
}
}
/// 校验权限
void _checkPermission(Permission permission) async {
final PermissionStatus status = await permission.status;
_handlePermissionStatus(permission, status);
}
void _handlePermissionStatus(Permission permission, PermissionStatus status) {
Log.d('_handlePermissionStatus=$status permission=$permission');
if (status.isGranted) {
_popPage();
return;
}
// 还未申请权限或之前拒绝了权限(在 iOS 上为首次申请权限,拒绝后将变为 `永久拒绝权限`)
if (status.isDenied) {
showAlert(
permission, msgList[0], msgList[3], _isGoSetting ? "前往系统设置" : "确定");
}
// 权限已被永久拒绝
if (status.isPermanentlyDenied) {
_isGoSetting = true;
showAlert(
permission, msgList[2], msgList[3], _isGoSetting ? "前往系统设置" : "确定");
}
// 拥有部分权限
if (status.isLimited) {
if (Platform.isIOS || Platform.isMacOS) _isGoSetting = true;
showAlert(
permission, msgList[1], msgList[3], _isGoSetting ? "前往系统设置" : "确定");
}
// 拥有部分权限,活动限制(例如,设置了家长///控件,仅在iOS以上受支持。(仅限 iOS)
if (status.isRestricted) {
if (Platform.isIOS || Platform.isMacOS) _isGoSetting = true;
showAlert(
permission, msgList[1], msgList[3], _isGoSetting ? "前往系统设置" : "确定");
}
}
void showAlert(Permission permission, String message, String cancelMsg,
String confirmMsg) {
if (_isDialogShowing) {
// 对话框已经在显示中,不重复弹出
Log.d("对话框已经在显示中,不重复弹出");
return;
}
_isDialogShowing = true;
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text("温馨提示"),
content: Text(message),
actions: [
TextButton(
child: Text(cancelMsg),
onPressed: () {
widget.isRequiredPermission
? _quitApp()
: _popDialogAndPage(context);
}),
TextButton(
child: Text(confirmMsg),
onPressed: () {
if (_isGoSetting) {
openAppSettings();
} else {
_requestPermisson(permission);
}
_popDialog(context);
})
],
);
}).then((value) => {
_isDialogShowing = false,
});
}
/// 申请权限
void _requestPermisson(Permission permission) async {
// 申请权限
PermissionStatus status = await permission.request();
Log.d('requestPermisson权限检测=$status _isGoSetting=$_isGoSetting');
// 再次校验
_handlePermissionStatus(permission, status);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
/// 退出应用程序
void _quitApp() {
SystemChannels.platform.invokeMethod("SystemNavigator.pop");
}
/// 关闭整个权限申请页面
void _popDialogAndPage(BuildContext dialogContext) {
_popDialog(dialogContext);
_popPage();
}
/// 关闭弹窗
void _popDialog(BuildContext dialogContext) {
Navigator.of(dialogContext).pop();
}
/// 关闭透明页面
void _popPage() {
Navigator.of(context).pop();
}
}