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

参考

相关推荐
亚洲小炫风22 分钟前
flutter 中各种日志
前端·flutter·日志·log
louisgeek3 小时前
Flutter 动画之 Implicit 隐式动画
flutter
勤劳打代码4 小时前
游刃有余 —— Isolate 轻量化实战
flutter·github·dart
RichardLai888 小时前
[Flutter 基础] - Flutter基础组件 - Text
android·flutter
Ya-Jun18 小时前
常用第三方库精讲:cached_network_image图片加载优化
android·flutter
WDeLiang20 小时前
Flutter 环境搭建
flutter·ios·visual studio code
程一个大前端1 天前
【Flutter高效开发】GetX指南:一文学会状态管理、路由与依赖注入
flutter
DEVIL1 天前
Flutter中各类Controller的本质
android·flutter
ak啊1 天前
Flutter UI 组件应用一:布局、交互、动画与弹窗
flutter
Lafar1 天前
Flutter与原生通讯的channel
flutter