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

结果如下图所示:


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

往期文章

个人主页

相关推荐
血色橄榄枝16 分钟前
04-06 Flutter列表清单实现上拉加载 + 下拉刷新 + 数据加载提示 On OpenHarmony
flutter
金山毒霸电脑医生21 分钟前
植物大战僵尸融合版下载与安装教程:PC/安卓/iOS 全面指南
游戏·ios·植物大战僵尸·植物大战僵尸融合版·游戏工具
小风呼呼吹儿21 分钟前
Flutter 框架跨平台鸿蒙开发 - 书法印章制作记录应用开发教程
flutter·华为·harmonyos
1登峰造极22 分钟前
uniapp 运行安卓报错reportJSException >>>> exception function:createInstanceContext, exception:white screen
android·java·uni-app
木易 士心22 分钟前
Android Handler 机制原理详解
android
kkk_皮蛋26 分钟前
作为一个学生,如何用免费 AI 工具手搓了一款 Android AI 日记 App
android·人工智能
金山毒霸电脑医生26 分钟前
植物大战僵尸杂交版最新v0.2版下载安装|2025图文解析教程
android·游戏·ios·植物大战僵尸·软件下载安装
羑悻的小杀马特27 分钟前
Docker-Android 容器化 + cpolar 穿透,完善异地调试
android·运维·docker·容器·cpolar
●VON29 分钟前
从系统亮度监听到 UI 重绘:Flutter for OpenHarmony TodoList 深色模式的端到端响应式实现
学习·flutter·ui·openharmony·布局·von
恋猫de小郭30 分钟前
Android Gradle Plugin 9.0 发布,为什么这会是个史诗级大坑版本
android·flutter·ios·开源