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

参考

相关推荐
yidahis5 分钟前
Flutter 运行新建项目也报错?
flutter·trae
木马不在转14 分钟前
Flutter-权限permission_handler插件配置
flutter
江上清风山间明月4 小时前
一周掌握Flutter开发--9. 与原生交互(下)
flutter·交互·原生·methodchannel
GeniuswongAir4 小时前
Flutter极速接入IM聊天功能并支持鸿蒙
flutter·华为·harmonyos
sayen4 小时前
记录 flutter 文本内容展示过长优化
前端·flutter
勤劳打代码4 小时前
剑拔弩张——焦点竞争引的发输入失效
flutter·客户端·设计
张风捷特烈8 小时前
Flutter 伪 3D 绘制#02 | 地平面与透视
android·flutter
关山月8 小时前
Flutter 图像上传与裁剪
flutter
陈朝晖SHS9 小时前
Flutter求助贴
flutter
恋猫de小郭9 小时前
Flutter Roadmap 2025 发布,快来看看有什么更新吧
android·前端·flutter