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

参考

相关推荐
肥肥呀呀呀27 分钟前
flutter 视频通话flutter_webrtc
flutter
明似水2 小时前
2025年Flutter项目管理技能要求
flutter
肥肥呀呀呀4 小时前
flutter使用命令生成BinarySize分析图
flutter
程序猿阿伟4 小时前
《数字分身进化论:React Native与Flutter如何打造沉浸式虚拟形象编辑》
flutter·react native·react.js
怀君4 小时前
Flutter——数据库Drift开发详细教程(六)
数据库·flutter
明似水20 小时前
2025年Flutter初级工程师技能要求
flutter
程序猿阿伟1 天前
《从像素到身份:Flutter如何打通社交应用人脸识别的技术闭环》
flutter
周胡杰2 天前
鸿蒙接入flutter环境变量配置windows-命令行或者手动配置-到项目的创建-运行demo项目
javascript·windows·flutter·华为·harmonyos·鸿蒙·鸿蒙系统
程序猿阿伟2 天前
《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》
flutter·react native·react.js
肥肥呀呀呀2 天前
在Flutter上如何实现按钮的拖拽效果
前端·javascript·flutter