flutter学习-day21-使用permission_handler进行系统权限的申请和操作
文章目录
- 1. 介绍
- 2. 环境准备
- 2-1. Android
- 2-2. iOS
- 3. 使用
1. 介绍
在大多数操作系统上,权限不是在安装时才授予应用程序的。相反,开发人员必须在应用程序运行时请求用户的许可。在 flutter 开发中,则需要一个跨平台(iOS, Android)的 API 来请求权限和检查他们的状态,这时候就需要使用 flutter 插件permission_handler来帮忙了。它允许您请求和检查权限。你还可以打开设备的应用程序设置,以便用户授予权限。
2. 环境准备
项目更目录打开运行窗口,安装插件:
flutter pub add permission_handler
当在运行时请求权限时,你仍然需要告诉操作系统你的应用程序可能会使用哪些权限。这需要在 Android 和 ios 特定文件中添加权限配置。
2-1. Android
- 检查你的 android 目录下的 gradle.properties 文件,是否有下列代码:
android.useAndroidX=true
android.enableJetifier=true
- 检查你的 android/app 目录下的 build.gradle 文件,是否有下列代码:
android {compileSdkVersion 33# 省略代码……
}
- 添加需要的权限到 android/app/src/main 目录下 AndroidManifest.xml 文件
<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
- 检查你的 ios 目录下的 podfile 文件,添加下列代码:
# 权限配置开始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
- 打开 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 | - |
<!-- 保存图片到相册 -->
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Please allow the APP to save photos to the album</string>
3. 使用
注意,获取存储权限的系统弹框只会出现一次,假如第一次不同意,下次再申请就需要自己写确认框引导用户打开 app 权限的页面:openAppSettings()。
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();}
}
结果如下图所示:


本次分享就到这儿啦,我是鹏多多,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~
往期文章
- flutter学习-day1-环境搭建和启动第一个项目
- flutter学习-day12-可滚动组件和监听
- Vue2全家桶+Element搭建的PC端在线音乐网站
- vue3+element-plus配置cdn
- 助你上手Vue3全家桶之Vue3教程
- 助你上手Vue3全家桶之VueX4教程
- 助你上手Vue3全家桶之Vue-Router4教程
- 超详细!Vue的九种通信方式
- 超详细!Vuex手把手教程
- 使用nvm管理node.js版本以及更换npm淘宝镜像源
- vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令
- 超详细!Vue-Router手把手教程
个人主页
- CSDN
- GitHub
- 简书
- 博客园
- 掘金
相关文章:
flutter学习-day21-使用permission_handler进行系统权限的申请和操作
文章目录 1. 介绍2. 环境准备2-1. Android2-2. iOS 3. 使用 1. 介绍 在大多数操作系统上,权限不是在安装时才授予应用程序的。相反,开发人员必须在应用程序运行时请求用户的许可。在 flutter 开发中,则需要一个跨平台(iOS, Android)的 API 来…...
虹科方案丨L2进阶L3,数据采集如何助力自动驾驶
来源:康谋自动驾驶 虹科方案丨L2进阶L3,数据采集如何助力自动驾驶 原文链接:https://mp.weixin.qq.com/s/qhWy11x_-b5VmBt86r4OdQ 欢迎关注虹科,为您提供最新资讯! 12月14日,宝马集团宣布,搭载…...
Kubernetes 学习总结(42)—— Kubernetes 之 pod 健康检查详解
Kubernetes 入门 回想 2017 年刚开始接触 Kubernetes 时,碰到 Pod一直起不来的情况,就开始抓瞎。后来渐渐地掌握了一些排查方法之后,这种情况才得以缓解。随着时间推移,又碰到了问题。有一天在部署某个 springboot 微服务时&…...
【后端】Docker学习笔记
文章目录 Docker一、Docker安装(Linux)二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台,主要基于Go语言构建,它使开发者能够将应用程序及其依赖项打包到一个轻…...
UE5.1_Gameplay Debugger启用
UE5.1_Gameplay Debugger启用 重点问题: Gamplay Debugger启用不知道? Apostrophe、Tilde键不知道是哪个? Gameplay调试程序 | 虚幻引擎文档 (unrealengine.com) Gameplay Debugger...
【论文阅读+复现】SparseCtrl: Adding Sparse Controls to Text-to-Video Diffusion Models
SparseCtrl:在文本到视频扩散模型中添加稀疏控制。 (AnimateDiff V3,官方版AnimateDiffControlNet,效果很丝滑) code:GitHub - guoyww/AnimateDiff: Official implementation of AnimateDiff. paper:htt…...
速盾cdn:ddos防护手段
速盾CDN采用多种手段来进行DDoS防护,以确保网络和网站的正常运行。以下是速盾CDN可能采用的一些主要DDoS防护手段: 实时监测和分析: 速盾CDN实时监测网络流量,通过分析流量模式来检测异常行为,以迅速发现潜在的DDoS攻击…...
STL——queue容器
1.queue基本概念 概念:queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。 队列容器允许从一端新增元素,从另一端移除元素。 队列中只有队头和队尾才可以被外界使用,因此队列不允许…...
gitLab页面打tag操作步骤
作者:moical 链接:gitLab页面打tag简单使用 - 掘金 (juejin.cn) 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ---------------------------------------------------------------------…...
神秘的Cookie和Session
Cookie 1.Cookie是什么? Cookie是浏览器提供的持久化储存数据的方式。 2.从哪里来? Cookie从服务器中来,存储到客户端中。一个客户端就对应着一个浏览器。 服务器代码中决定了什么样的数据会储存到客户端中,通过HTTP相应的Se…...
springboot接口文档
Swagger 在Spring Boot中生成和维护接口文档的一个常用方法是使用Swagger。Swagger是一个开源软件框架,它帮助开发者设计、构建、记录和使用RESTful Web服务。下面是在Spring Boot项目中使用Swagger来创建接口文档的详细步骤:1. 添加Swagger依赖 在你的Spring Boot项目的pom…...
深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈
深入浅出图解C#堆与栈 C# HeapingVS Stacking第一节 理解堆与栈 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.csdn.n…...
Maven的使用和配置
Maven的使用和配置 起源: Apache 软件基金会(非营业的组织,把一些开源软件维护管理起来) maven 是apache的一个开源项目,是一个优秀的项目构建(管理)工具, maven 管理项目中的jar,以及jar与jar之间的依赖 maven 可…...
MongoDB 数据类型
目录 BSON 类型 二进制数据(Binary Data) ObjectId ObjectId定义 文档中的ObjectId ObjectId的单调性 字符串(String) 时间戳(Timestamps) 日期(Date) BSON类型的排序 数…...
Java 将 List 转换为 String常见方式
将 List 转换为 String的几种方式 使用 List的toString()方法将 List 转换为 String;结果前后会带有英文的中括号[],如:[1, 2, 3, 4, 5]使用Java8 stream流中的Collections.joining()方法,带有逗号分隔符或自定义分隔符将集合转成…...
Redis(认识NoSQL,认识redis,安装redis,redis桌面客户端,redis常见命令,redis的Java客户端)
文章目录 Redis快速入门1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启 1.4.Redis桌面客户端…...
idea 出现Cannot resolve symbol ‘springframework‘解决方法
Maven手动重新加载 1)File–>Invalidate Caches / Restart… 清理缓存,重启idea客户端 2)File–>Maven–>Reload project重新从maven中加载工程依赖的组件...
ubuntu22.04安装anacoda遇到的坑
这几天把用了3年的windows10换成了ubuntu22.04 各种环境都得配置,本文记录下遇到的坑。 1、anacoda在ubuntu上也可以用官方也提供了安装包,但是没有图形界面,需要以命令行的方式安装和运行配置 1.1 安装:官网下载后,…...
window的OPen方法,弹窗的特征
文章目录 一、介绍二、弹窗的特征 一、介绍 window.open() 方法是 JavaScript 中的一个内置方法,用于在浏览器中打开一个新的窗口或标签页。 语法: window.open(url, name, features, replace)二、弹窗的特征 open方法参数说明: 参数说明url要载入窗…...
DFS算法查找所有路径详解
DFS算法查找所有路径详解 算法介绍 深度优先搜索(Depth-First Search,DFS)是一种图遍历算法,它从起始节点开始,沿着一条路径尽可能深入,直到达到最深的节点,然后回溯到前一节点,继…...
3步搞定iOS微信聊天记录完整导出:WeChatExporter终极指南
3步搞定iOS微信聊天记录完整导出:WeChatExporter终极指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 还在为无法备份微信聊天记录而烦恼吗?微…...
[AI/Agent/社交] AI Agent社交网络产品:MoltBook => InStreet
Julia(julialang.org)由Stefan Karpinski、Jeff Bezanson等在2009年创建,目标是融合Python的易用性、C的高性能、R的统计能力、Matlab的科学计算生态。 其核心设计哲学是: 高性能:编译型语言(JIT࿰…...
BAR和BA
BAR 是请求方发出的“问题”:“我刚才发的那批数据包,你收到了哪几个?”BA 是接收方回复的“答案”:“我收到了第1、3、4、5个包,第2个没收到。”BAR - Block Ack Request(块确认请求) 角色与发…...
Qwen3.5-9B生产环境实测:7x24小时稳定运行+自动恢复+错误率<0.3%运维报告
Qwen3.5-9B生产环境实测:7x24小时稳定运行自动恢复错误率<0.3%运维报告 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在实际生产环境中展现出卓越的稳定性和可靠性。经过长达一个月的7x24小时不间断运行测试,该系统实现了…...
2025最权威的降AI率网站实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 有的技术方案,其旨在减低文本人工智能生成特征,这就是降AIGC工具。它…...
教师评估软件市场迎增长机遇:未来六年CAGR锁定6.7%,教育数字化转型添动能
据恒州诚思调研统计,2025年全球教师评估软件市场规模约30.58亿元,预计未来将持续平稳增长,到2032年市场规模将接近47.92亿元,未来六年复合年增长率(CAGR)为6.7%。在教育行业数字化转型加速的背景下…...
效率提升:基于快马AI生成vmware虚拟机自动化部署脚本,告别手动配置
在开发过程中,虚拟机环境的搭建往往是耗时又容易出错的环节。特别是当需要频繁创建不同配置的虚拟机时,手动操作不仅效率低下,还容易遗漏关键步骤。最近尝试用自动化脚本解决这个问题,效果出乎意料地好,分享下具体实现…...
AI Token Platform - AI Token 中转计费平台
AI Token Platform - AI Token 中转计费平台 AI Token Platform 是一款企业级 AI Token 中转与计费平台,深度融合 多模型 AI 网关、Kill Bill 计费引擎 与 企业级会员管理 三大核心能力。平台以"统一 API 接入 灵活计费策略 企业级会员体系"为核心理念…...
VOOHU沃虎:从SFP到SFP28不同光模块如何选笼子?
在高速通信设备的设计中,SFP光模块笼子是一个看似简单却至关重要的组件。随着数据传输速率从1G演进到10G、25G乃至更高,光模块对笼子的要求也在发生质的变化。SFP(1G)、SFP(10G)、SFP28(25G&…...
BI 项目交付 SOP
...
