Flutter权限管理三步走
1. 检查权限状态
首先检查当前权限状态,避免重复申请:
// 检查单个权限状态
PermissionStatus status = await Permission.camera.status;
// 检查多个权限状态
Map<Permission, PermissionStatus> statuses = await [
Permission.camera,
Permission.microphone,
].status;
权限状态有以下几种:
isGranted
- 已授权isDenied
- 被拒绝isPermanentlyDenied
- 被永久拒绝(需要去设置页开启)isRestricted
- 受限制(仅iOS)
2. 申请权限
根据检查结果决定是否申请权限:
// 申请单个权限
if (status.isDenied) {
PermissionStatus result = await Permission.camera.request();
if (result.isGranted) {
// 权限通过
}
}
// 同时申请多个权限
Map<Permission, PermissionStatus> results = await [
Permission.camera,
Permission.location,
].request();
3. 处理权限结果
针对不同结果进行处理:
// 处理单个权限结果
void handlePermission(PermissionStatus status) {
if (status.isGranted) {
// 执行需要权限的操作
} else if (status.isPermanentlyDenied) {
// 引导用户去设置页
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text("权限被永久拒绝"),
content: Text("请在设置中手动开启权限"),
actions: [
TextButton(
onPressed: () => openAppSettings(),
child: Text("去设置"),
),
],
),
);
} else {
// 提供无权限的替代方案
showAlternative();
}
}
// 处理多个权限结果
void handleMultiplePermissions(Map<Permission, PermissionStatus> results) {
results.forEach((permission, status) {
if (!status.isGranted) {
print("$permission 被拒绝");
}
});
}
完整示例
// 权限检查+申请+处理三合一方法
Future<bool> managePermission(Permission permission, BuildContext context) async {
// 1. 检查权限
PermissionStatus status = await permission.status;
if (status.isGranted) return true;
// 2. 申请权限
if (status.isDenied) {
status = await permission.request();
}
// 3. 处理结果
if (status.isGranted) {
return true;
} else if (status.isPermanentlyDenied) {
bool openSettings = await showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text("权限被永久拒绝"),
content: Text("需要去设置页手动开启"),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx, false),
child: Text("取消"),
),
TextButton(
onPressed: () => Navigator.pop(ctx, true),
child: Text("去设置"),
),
],
),
) ?? false;
if (openSettings) await openAppSettings();
return false;
} else {
return false;
}
}
// 使用示例
bool canUseCamera = await managePermission(Permission.camera, context);
if (canUseCamera) {
startCamera();
}
实用技巧
- 权限分组申请:
// 多媒体相关权限组
const mediaPermissions = [
Permission.camera,
Permission.microphone,
Permission.storage,
];
- 带解释的申请:
Future<bool> requestWithExplanation(
Permission permission,
String reason,
BuildContext context
) async {
if (await permission.isGranted) return true;
bool shouldRequest = await showExplanationDialog(context, reason);
return shouldRequest ? await permission.request().isGranted : false;
}
- 最小化权限请求:
- 只在用户触发相关功能时请求
- 不要一次性请求所有权限
- 优先请求必要权限