flutter学习-day21-使用permission_handler进行系统权限的申请和操作

文章目录

  • [1. 介绍](#1. 介绍)
  • [2. 环境准备](#2. 环境准备)
    • [2-1. Android](#2-1. Android)
    • [2-2. iOS](#2-2. iOS)
  • [3. 使用](#3. 使用)

1. 介绍

在大多数操作系统上,权限不是在安装时才授予应用程序的。相反,开发人员必须在应用程序运行时请求用户的许可。在 flutter 开发中,则需要一个跨平台(iOS, Android)的 API 来请求权限和检查他们的状态,这时候就需要使用 flutter 插件permission_handler来帮忙了。它允许您请求和检查权限。你还可以打开设备的应用程序设置,以便用户授予权限。

2. 环境准备

项目更目录打开运行窗口,安装插件:

shell 复制代码
flutter pub add permission_handler

当在运行时请求权限时,你仍然需要告诉操作系统你的应用程序可能会使用哪些权限。这需要在 Android 和 ios 特定文件中添加权限配置。

2-1. Android

  1. 检查你的 android 目录下的 gradle.properties 文件,是否有下列代码:
yaml 复制代码
android.useAndroidX=true
android.enableJetifier=true
  1. 检查你的 android/app 目录下的 build.gradle 文件,是否有下列代码:
yaml 复制代码
android {
  compileSdkVersion 33
  # 省略代码......
}
  1. 添加需要的权限到 android/app/src/main 目录下 AndroidManifest.xml 文件
yaml 复制代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 读权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    # 省略代码......
</manifest>

2-2. iOS

  1. 检查你的 ios 目录下的 podfile 文件,添加下列代码:
yaml 复制代码
# 权限配置开始
  config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
      '$(inherited)',

      ## 仅允许写入日历的权限(iOS 16 及以下)
      # 'PERMISSION_EVENTS=1',

      ## 允许完全访问日历的权限(iOS 17及以上)
      # 'PERMISSION_EVENTS_FULL_ACCESS=1',

      ## 提醒事项权限
      # 'PERMISSION_REMINDERS=1',

      ## 联系人权限
      # 'PERMISSION_CONTACTS=1',

      ## 相机权限
      # 'PERMISSION_CAMERA=1',

      ## 麦克风权限
      # 'PERMISSION_MICROPHONE=1',

      ## 语音识别权限
      # 'PERMISSION_SPEECH_RECOGNIZER=1',

      ## 照片权限
      # 'PERMISSION_PHOTOS=1',

      ## 位置权限组(包括始终、使用中)
      # 'PERMISSION_LOCATION=1',

      ## 通知权限
      # 'PERMISSION_NOTIFICATIONS=1',

      ## 媒体库权限
      # 'PERMISSION_MEDIA_LIBRARY=1',

      ## 传感器权限
      # 'PERMISSION_SENSORS=1',

      ## 蓝牙权限
      # 'PERMISSION_BLUETOOTH=1',

      ## 应用跟踪透明度权限
      # 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',

      ## 关键警报权限
      # 'PERMISSION_CRITICAL_ALERTS=1'
    ]
    # 权限配置结束
  end
  1. 打开 ios/Runner 目录中的 Info.plist 文件,添加需要的权限
权限名 Info.plist 的键 指令 Macro
日历权限(< iOS 17) NSCalendarsUsageDescription PERMISSION_EVENTS
日历写权限(iOS 17+) NSCalendarsWriteOnlyAccessUsageDescription PERMISSION_EVENTS
日历完全访问权限(iOS 17+) NSCalendarsFullAccessUsageDescription PERMISSION_EVENTS_FULL_ACCESS
提醒事项权限 NSRemindersUsageDescription PERMISSION_REMINDERS
联系人权限 NSContactsUsageDescription PERMISSION_CONTACTS
相机权限 NSCameraUsageDescription PERMISSION_CAMERA
相册权限 NSPhotoLibraryAddUsageDescription -
麦克风权限 NSMicrophoneUsageDescription PERMISSION_MICROPHONE
语音识别权限 NSSpeechRecognitionUsageDescription PERMISSION_SPEECH_RECOGNIZER
照片权限 NSPhotoLibraryUsageDescription PERMISSION_PHOTOS
位置权限 NSLocationUsageDescription, PERMISSION_LOCATION
始终使用位置权限 NSLocationAlwaysAndWhenInUseUsageDescription PERMISSION_NOTIFICATIONS
仅在使用时使用位置权限 NSLocationWhenInUseUsageDescription PERMISSION_NOTIFICATIONS
通知权限 PermissionGroupNotification PERMISSION_NOTIFICATIONS
媒体库权限 NSAppleMusicUsageDescription(需要与一个字符串(string)配对使用) -
媒体库权限 kTCCServiceMedia -
yaml 复制代码
<!-- 保存图片到相册 -->
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Please allow the APP to save photos to the album</string>

3. 使用

注意,获取存储权限的系统弹框只会出现一次,假如第一次不同意,下次再申请就需要自己写确认框引导用户打开 app 权限的页面:openAppSettings()。

dart 复制代码
import 'package:flutter/foundation.dart';
import 'package:permission_handler/permission_handler.dart';

/// 获取存储权限
Future<bool> getStoragePermission() async {
  late PermissionStatus myPermission;

  /// 读取系统权限
  if (defaultTargetPlatform == TargetPlatform.iOS) {
    myPermission = await Permission.photosAddOnly.request();
  } else {
    myPermission = await Permission.storage.request();
  }
  if (myPermission != PermissionStatus.granted) {
    return false;
  } else {
    return true;
  }
}

void checkPermission() async {
  // 请求存储权限
  final permissionState = await getStoragePermission();
  if (permissionState) {
    // 权限被授予
  } else {
    // 权限被拒绝 打开手机上该App的权限设置页面
    openAppSettings();
  }
}

结果如下图所示:


本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

往期文章

个人主页

相关推荐
能不能别报错4 分钟前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
maki0778 分钟前
VR大空间资料 04 —— VRAF使用体验和源码分析
android·vr·虚幻·源码分析
ᖰ・◡・ᖳ20 分钟前
JavaScript:神奇的ES6之旅
前端·javascript·学习·es6
小马学嵌入式~1 小时前
堆排序原理与实现详解
开发语言·数据结构·学习·算法
递归不收敛1 小时前
吴恩达机器学习课程(PyTorch适配)学习笔记:1.4 模型评估与问题解决
pytorch·学习·机器学习
又是忙碌的一天1 小时前
前端学习 JavaScript
前端·javascript·学习
ooo-p1 小时前
FPGA学习篇——Verilog学习之计数器的实现
学习·fpga开发
A9better2 小时前
嵌入式开发学习日志37——stm32之USART
stm32·嵌入式硬件·学习
zhangrelay2 小时前
ROS云课三分钟-使用动态参数重配置调试Teb导航案例-251008
笔记·学习
消失的旧时光-19432 小时前
Kotlin 判空写法对比与最佳实践
android·java·kotlin