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

  1. 检查你的 android 目录下的 gradle.properties 文件,是否有下列代码:
android.useAndroidX=true
android.enableJetifier=true
  1. 检查你的 android/app 目录下的 build.gradle 文件,是否有下列代码:
android {compileSdkVersion 33# 省略代码……
}
  1. 添加需要的权限到 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

  1. 检查你的 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
  1. 打开 ios/Runner 目录中的 Info.plist 文件,添加需要的权限
权限名Info.plist 的键指令 Macro
日历权限(< iOS 17)NSCalendarsUsageDescriptionPERMISSION_EVENTS
日历写权限(iOS 17+)NSCalendarsWriteOnlyAccessUsageDescriptionPERMISSION_EVENTS
日历完全访问权限(iOS 17+)NSCalendarsFullAccessUsageDescriptionPERMISSION_EVENTS_FULL_ACCESS
提醒事项权限NSRemindersUsageDescriptionPERMISSION_REMINDERS
联系人权限NSContactsUsageDescriptionPERMISSION_CONTACTS
相机权限NSCameraUsageDescriptionPERMISSION_CAMERA
相册权限NSPhotoLibraryAddUsageDescription-
麦克风权限NSMicrophoneUsageDescriptionPERMISSION_MICROPHONE
语音识别权限NSSpeechRecognitionUsageDescriptionPERMISSION_SPEECH_RECOGNIZER
照片权限NSPhotoLibraryUsageDescriptionPERMISSION_PHOTOS
位置权限NSLocationUsageDescription,PERMISSION_LOCATION
始终使用位置权限NSLocationAlwaysAndWhenInUseUsageDescriptionPERMISSION_NOTIFICATIONS
仅在使用时使用位置权限NSLocationWhenInUseUsageDescriptionPERMISSION_NOTIFICATIONS
通知权限PermissionGroupNotificationPERMISSION_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
  • 简书
  • 博客园
  • 掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2660915.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

GoLang学习之路,对Elasticsearch的使用,一文足以(包括泛型使用思想)(二)

书写上回&#xff0c;上回讲到&#xff0c;Elasticsearch的使用前提即&#xff1a;语法&#xff0c;表结构&#xff0c;使用类型结构等。要学这个必须要看前面这个&#xff1a;GoLang学习之路&#xff0c;对Elasticsearch的使用&#xff0c;一文足以&#xff08;包括泛型使用思…

NXP实战笔记(三):S32K3xx基于RTD-SDK在S32DS上配置WDT配置

目录 1、WDT概述 2、SWT配置 2.1、超时时间&#xff0c;复位方式的配置 2.2、中断形式 1、WDT概述 SWT 编程模型只允许 32 位&#xff08;字&#xff09;访问。 以下任何尝试访问都是无效的: •非32位访问 •写入只读寄存器 •启用SWT时&#xff0c;将不正确的值写入SR…

java 纯代码导出pdf合并单元格

java 纯代码导出pdf合并单元格 接上篇博客 java导出pdf&#xff08;纯代码实现&#xff09; 后有一部分猿友叫我提供一下源码&#xff0c;实际上我的源码已经贴在帖子上了&#xff0c;都是同样的步骤&#xff0c;只是加多一点设置就可以了。今天我再次上传一下相对情况比较完整…

Python中实现列表边循环边删除的详细指南

更多Python学习内容&#xff1a;ipengtao.com 在 Python 中&#xff0c;有时需要在遍历列表的同时对其进行修改&#xff0c;即边循环边删除元素。这可能涉及到一些注意事项&#xff0c;以确保不会导致意外结果。本文将深入探讨如何在 Python 中实现这一需求&#xff0c;并提供详…

使用vue3实现echarts漏斗图表以及实现echarts全屏放大效果

1.首先安装echarts 安装命令&#xff1a;npm install echarts --save 2.页面引入 echarts import * as echarts from echarts; 3.代码 <template> <div id"main" :style"{ width: 400px, height: 500px }"></div> </template> …

基于element ui封装table组件

效果图&#xff1a; 1.封装表格代码如下 <template> <div><div class"TableList"><el-tablev-loading"loading"selection-change"selectionChange"class"table":data"tableData":border"hasBorde…

table表格中使用el-popover 无效问题解决

实例只针对单个的按钮管用在表格里每一列都有el-popover相当于是v-for遍历了 所以我们在触发按钮的时候并不是单个的触发某一个 主要执行 代码 <el-popover placement"left" :ref"popover-${scope.$index}"> 动态绑定了ref 关闭弹窗 执行deltask…

Centos如何修改ssh端口

想必很大一部分的同学用的是centos服务器&#xff0c;对于默认的22端口存在一定的安全风险&#xff0c;所以今天我们一起看下如何修改ssh端口 一、什么是SSH SSH&#xff08;Secure Shell&#xff09;是一种安全的远程登录协议&#xff0c;它允许您通过网络远程连接到Linux系统…

【零基础入门VUE】VueJS - 环境设置

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 直接在 HTML 文件中使用 <script> 标签 <html><head><script type "text/javascript" src "vue.min.j…

【一分钟】ThinkPHP v6.0 (poc-yaml-thinkphp-v6-file-write)环境复现及poc解析

写在前面 一分钟表示是非常短的文章&#xff0c;只会做简单的描述。旨在用较短的时间获取有用的信息 环境下载 官方环境下载器&#xff1a;https://getcomposer.org/Composer-Setup.exe 下载文档时可以设置代理&#xff0c;不然下载不上&#xff0c;你懂的 下载成功 cmd cd…

SASS循环

<template><div><button class"btn type-1">默认按钮</button><button class"type-2">主要按钮</button><button class"type-3">成功按钮</button><button class"type-4">信息…

Jetpack Compose中使用Android View

使用AndroidView创建日历 Composable fun AndroidViewPage() {AndroidView(factory {CalendarView(it)},modifier Modifier.fillMaxWidth(),update {it.setOnDateChangeListener { view, year, month, day ->Toast.makeText(view.context, "${year}年${month 1}月$…

《MySQL》事务篇

事务特性 ACID Atomicity原子性&#xff1a;事务中的操作要么全部完成&#xff0c;要么全部失败。 Consistency一致性&#xff1a;事务操作前后&#xff0c;数据满足完整性约束。 Isolation隔离性&#xff1a;允许并发执行事务&#xff0c;每个事务都有自己的数据空间&…

Linux中的gcc\g++使用

文章目录 gcc\g的使用预处理编译汇编链接函数库gcc选项 gcc\g的使用 这里我们需要知道gcc和g实际上是对应的c语言和c编译器&#xff0c;而其他的Java&#xff08;半解释型&#xff09;&#xff0c;PHP&#xff0c;Python等语言实际上是解释型语言&#xff0c;因此我们经常能听…

单字符检测模型charnet使用方法,极简

Git链接 安装按照上面的说明&#xff0c;说下使用。 把tools下面的test做了一点修改&#xff0c;可以读取一张图片&#xff0c;把里面的单个字符都检测和识别出来。 然后绘制到屏幕上。 import torch from charnet.modeling.model import CharNet import cv2, os import num…

scratch打砖块游戏 2023年12月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

scratch打砖块游戏 2023年12月电子学会图形化编程Scratch等级考试三级真题 一、题目要求 1、准备工作 (1)删除小猫角色,选择角色小球Ball、砖块Button3和球板Paddle (2)选择背景Stars,在背景底端绘制一条红色的线段 (3)建立一个变量“分数” 2、功能实现 (1)…

EXPLORING DIFFUSION MODELS FOR UNSUPERVISED VIDEO ANOMALY DETECTION 论文阅读

EXPLORING DIFFUSION MODELS FOR UNSUPERVISED VIDEO ANOMALY DETECTION 论文阅读 ABSTRACT1. INTRODUCTION2. RELATEDWORK3. METHOD4. EXPERIMENTAL ANALYSIS AND RESULTS4.1. Comparisons with State-Of-The-Art (SOTA)4.2. Diffusion Model Analysis4.3. Qualitative Result…

iPhone 13 Pro 更换『移植电芯』和『超容电池』体验

文章目录 考虑换电池Ⅰ 方案一Ⅱ 方案二 总结危险 Note系列地址 简 述: 首发买的iPhone 13P &#xff08;2021.09&#xff09;&#xff0c;随性使用一年出头&#xff0c;容量就暴跌 85%&#xff0c;对比朋友一起买的同款&#xff0c;还是95%。这已经基本得一天两充 >_<&a…

C# WPF上位机开发(报表导出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于在工厂上班的小伙伴来说&#xff0c;导出生产数据、生成报表&#xff0c;这是很习以为常的一个工作。之前的文章中&#xff0c;虽然我们也介绍…

git 学习 之一个规范的 commit 如何写

最好的话做一件完整的事情就提交一次