在 App 中,我们需要申请权限才能执行一些特殊操作,比如拍照、录音等。在 Flutter 里,处理权限问题一般借助 permission_handler
插件来实现的。
添加依赖
在 pubspec.yaml
文件中添加 permission_handler
插件,代码示例如下:
yaml
dependencies:
permission_handler: ^11.4.0
然后在代码中导入 import 'package:permission_handler/permission_handler.dart';
就可以使用该插件了。
平台配置相关的权限
当在运行时请求权限时,我们仍然需要告诉操作系统你的应用程序可能会使用哪些权限。这需要在Android和ios特定文件中添加权限配置。
Android 的配置
- 在 gradle.properties 文件中增加如下内容
ini
android.useAndroidX=true
android.enableJetifier=true
-
确保你在"android/app/build.gradle"中设置了compileSdkVersion 为 33:
android {
compileSdkVersion 33
...
} -
在 AndroidManifest.xml 中添加需要的权限
IOS 的配置
IOS的配置具体可以看 官方文档
permission_handler 的使用
这里以请求相机的权限为例,介绍如何使用 permission_handler
- 获取权限的状态
csharp
// 调用 Permission.camera.status 方法来获取相机权限的当前状态,
// 并将其赋值给变量 status。此方法会异步返回相机权限的状态信息。
var status = await Permission.camera.status;
// 检查相机权限状态是否为 "被拒绝"(isDenied)。
// 若为 "被拒绝",意味着还未请求过权限,或者之前请求过但被用户拒绝了,不过并非永久拒绝。
if (status.isDenied) {
...
}
// 你也可以直接询问某个权限的状态。
// 这里直接调用 Permission.location.isRestricted 来检查定位权限是否被系统限制,
// 此方法会异步返回一个布尔值,指示定位权限是否受限制。
if (await Permission.location.isRestricted) {
// 若定位权限被限制,通常是由于操作系统的限制,
// 例如开启了家长控制功能,导致应用无法正常访问定位权限。
}
- 权限请求以及回调
dart
// 以下代码通过链式调用的方式为相机权限的不同状态设置回调函数,然后发起权限请求。
// 首先使用 await 关键字,因为权限请求是一个异步操作,等待整个请求流程完成。
await
// 获取相机权限的 Permission 实例,后续的操作都基于相机权限展开。
Permission.camera
// 设置当相机权限被拒绝时的回调函数。
// 当用户拒绝了相机权限请求,就会执行该回调函数内的代码。
.onDeniedCallback(() {
...
})
// 设置当相机权限被授予时的回调函数。
// 当用户同意授予相机权限,就会执行该回调函数内的代码。
.onGrantedCallback(() {
...
})
// 设置当相机权限被永久拒绝时的回调函数。
// 当用户在拒绝权限时选择了不再询问,就会触发此回调。
.onPermanentlyDeniedCallback(() {
...
})
// 设置当相机权限受到限制时的回调函数。
// 例如因为系统设置(如家长控制)导致权限受限,会触发此回调。
.onRestrictedCallback(() {
...
})
// 设置当相机权限为有限权限时的回调函数。
// 在某些系统中,用户可能会授予应用有限的权限访问,此时会触发此回调。
.onLimitedCallback(() {
...
})
// 设置当相机权限为临时权限时的回调函数。
// 某些系统可能会提供临时权限,这种情况下会触发此回调。
.onProvisionalCallback(() {
...
})
// 发起相机权限请求,前面设置的各个回调函数会根据权限请求的结果来执行。
.request();
- 请求多个权限
ini
// 请求多个权限。
Map<Permission, PermissionStatus> statuses = await [
Permission.location,
Permission.storage,
].request();
print(statuses[Permission.location]);
- 打开应用设置
scss
// 此代码块用于检查语音权限是否被永久拒绝。
if (await Permission.speech.isPermanentlyDenied) {
// 如果语音权限被永久拒绝,会执行到这里。
// 在这种情况下,唯一能改变权限状态的方法是让用户手动在系统设置中启用该权限。
// 调用 openAppSettings() 打开应用的系统设置页面。这样用户就可以在系统设置中手动更改语音权限的状态。
openAppSettings();
}