Flutter 教程(九)权限

在 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 的配置

  1. 在 gradle.properties 文件中增加如下内容
ini 复制代码
android.useAndroidX=true
android.enableJetifier=true
  1. 确保你在"android/app/build.gradle"中设置了compileSdkVersion 为 33:

    android {
    compileSdkVersion 33
    ...
    }

  2. 在 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();
}

参考

相关推荐
钛态8 小时前
Flutter for OpenHarmony:mockito 单元测试的替身演员,轻松模拟复杂依赖(测试驱动开发必备) 深度解析与鸿蒙适配指南
服务器·驱动开发·安全·flutter·华为·单元测试·harmonyos
念格10 小时前
Flutter 弹窗 UI 不刷新?用 StatefulBuilder 解决
flutter
程序员老刘12 小时前
2026春招Flutter岗位为何变少?我看到的3个招聘逻辑变化
flutter·ai编程·客户端
念格13 小时前
Flutter 实现点击任意位置收起键盘的最佳实践
flutter
念格13 小时前
Flutter ListView Physics 滚动物理效果详解
flutter
国医中兴13 小时前
ClickHouse的数据模型设计:从理论到实践
flutter·harmonyos·鸿蒙·openharmony
国医中兴16 小时前
ClickHouse数据导入导出最佳实践:从性能到可靠性
flutter·harmonyos·鸿蒙·openharmony
国医中兴16 小时前
大数据处理的性能优化技巧:从理论到实践
flutter·harmonyos·鸿蒙·openharmony
●VON18 小时前
Flutter 入门指南:从基础组件到状态管理核心机制
前端·学习·flutter·von
西西学代码18 小时前
Flutter---SingleChildScrollView
前端·javascript·flutter