当前位置: 首页 > article >正文

Flutter 权限申请

这篇文章是基于permission_handler 10.2.0版本写的

前言

在App开发过程中我们经常要用到各种权限,我是用的是permission_handler包来实现权限控制的。

pub地址:https://pub.dev/packages/permission_handler

 

permission_handler 权限列表

变量

Android

Ios

accessMediaLocation

允许应用程序访问任何地理位置
持久化到用户的共享集合中。

accessNotificationPolicy

允许用户访问手机的通知策略。

比如:允许应用程序打开和关闭请勿打扰。

activityRecognition

Android>=Q:活动识别
Android<Q:无

appTrackingTransparency

无无允许用户接受您的应用程序收集有关最终用户的数据,并与其他公司共享,以便在应用程序和网站之间进行跟踪。

audio

在Android T及以上版本上运行时:从外部存储读取音频文件
在Android上运行时<T:无反应

bluetooth

iOS 13及以上版本:核心蓝牙管理器的授权状态。
当运行<iOS 13或Android>时,这始终是允许的。

bluetoothAdvertise

允许用户使其他用户可以发现此蓝牙设备

bluetoothConnect

允许用户连接已配对的蓝牙设备

bluetoothScan

允许用户查找蓝牙设备

比如:BLE外围设备

calendar

日历

日历(活动)

camera

摄像头照片(相机胶卷和相机)

contacts

联系人

通讯录

criticalAlerts

覆盖振铃器的通知

ignoreBatteryOptimizations

忽略电池优化

location

精细和粗略定位核心定位(始终使用和在使用时使用)

locationAlways

Android版本<Q上:精细和粗略定位
Android >=Q :后台位置权限

核心定位-始终

当请求此权限时,用户需要首先授予“locationWhenUse”权限,单击弹出窗口上的“Allow While Using App”选项。允许权限后,用户可以请求“locationAlways”权限,并可以单击“Change to Always Allow”选项。

locationWhenInUse

精细和粗略定位

核心定位-何时使用

manageExternalStorage

允许应用程序广泛访问作用域存储中的外部存储。

只有当您的应用程序无法有效使用更隐私友好的API时,您才应请求“管理外部存储”权限。有关详细信息:https://developer.android.com/training/data-storage/manage-all-files

当隐私友好的API(即[Storage Access Framework](https://developer.android.com/guide/topics/providers/document-provider)或[MediaStore](https://developer.android.com/training/data-storage/shared/media)API)是您的应用程序所需的全部权限。[PermissionGroup.storage]是您需要请求的唯一权限。

如果需要使用“管理外部存储”权限,您必须在向Google Play商店提交应用程序时填写“权限声明表”。更多详细信息,请点击此处:https://support.google.com/googleplay/android-developer/answer/9214102#zipp

mediaLibrary

多媒体库

microphone

麦克风麦克风

nearbyWifiDevices

允许用户通过Wi-Fi连接到附近的设备

notification

通知通知

phone

手机

photos

android

Android版本>=T :从外部存储读取图像文件Android版本<T:无

照片

iOS 14+读写访问级别 

photosAddOnly

照片
iOS 14+读写访问级别

reminders

提醒

requestInstallPackages

允许应用程序请求安装软件包

scheduleExactAlarm

在Android S及以上版本上运行时:允许精确的报警功能
在Android上运行时<S:无

sensors

身体传感器核心运动

sms

sms

speech

麦克风语音

storage

外部存储访问“文档”或“下载”等文件夹。默示授予。

systemAlertWindow

允许应用程序创建显示在所有其他应用程序之上的窗口

unknown

未知仅用于返回类型,从未请求

videos

在Android T及以上版本上运行时:从外部存储读取视频文件

在Android T及以上版本下运行时:无反应

配置

Android

1.在项目根目录/android/gradle.properties文件中添加如下内容

android.useAndroidX=true
android.enableJetifier=true

 

 

2.在项目根目录/android/app/build.gradle文件中添加如下内容

android {
  compileSdkVersion 33
  ...
}

我是修改了flutter_tool的配置,到Flutter的安装环境目录/flutter/packages/flutter_tools/gradle/flutter.gradle


3.在项目根目录/android/app/src/main/AndroidManifest.xml中添加所需权限即可。

ios

1.在项目根目录/ios/Profile文件中添加如下内容

post_install do |installer|
  installer.pods_project.targets.each do |target|
    ... # Here are some configurations automatically generated by flutter
   
    # Start of the permission_handler configuration
    target.build_configurations.each do |config|
    
      # You can enable the permissions needed here. For example to enable camera
      # permission, just remove the `#` character in front so it looks like this:
      #
      # ## dart: PermissionGroup.camera
      # 'PERMISSION_CAMERA=1'
      #
      #  Preprocessor definitions can be found in: https://github.com/Baseflow/flutter-permission-handler/blob/master/permission_handler_apple/ios/Classes/PermissionHandlerEnums.h
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',
   
        ## dart: PermissionGroup.calendar
        # 'PERMISSION_EVENTS=1',
   
        ## dart: PermissionGroup.reminders
        # 'PERMISSION_REMINDERS=1',
   
        ## dart: PermissionGroup.contacts
        # 'PERMISSION_CONTACTS=1',
   
        ## dart: PermissionGroup.camera
        # 'PERMISSION_CAMERA=1',
   
        ## dart: PermissionGroup.microphone
        # 'PERMISSION_MICROPHONE=1',
   
        ## dart: PermissionGroup.speech
        # 'PERMISSION_SPEECH_RECOGNIZER=1',
   
        ## dart: PermissionGroup.photos
        # 'PERMISSION_PHOTOS=1',
   
        ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
        # 'PERMISSION_LOCATION=1',
           
        ## dart: PermissionGroup.notification
        # 'PERMISSION_NOTIFICATIONS=1',
   
        ## dart: PermissionGroup.mediaLibrary
        # 'PERMISSION_MEDIA_LIBRARY=1',
   
        ## dart: PermissionGroup.sensors
        # 'PERMISSION_SENSORS=1',  
            
        ## dart: PermissionGroup.bluetooth
        # 'PERMISSION_BLUETOOTH=1',
    
        ## dart: PermissionGroup.appTrackingTransparency
        # 'PERMISSION_APP_TRACKING_TRANSPARENCY=1',
    
        ## dart: PermissionGroup.criticalAlerts
        # 'PERMISSION_CRITICAL_ALERTS=1'
      ]
   
    end
    # End of the permission_handler configuration
  end
end

2.用到哪个权限取消对应的注释即可,例如

## dart: PermissionGroup.calendar
        'PERMISSION_EVENTS=1',

3.在Info.plist添加对应的权限以及含义即可

使用方式

获取权限是否状态

var status = await Permission.phone.status;

同时请求多个权限


Map<Permission, PermissionStatus> statuses = await [
      Permission.location,
      Permission.storage,
      Permission.camera,
    ].request();
    print(statuses[Permission.location]);

单个权限申请

Future<bool> requestCalendarPermission() async {
    //获取当前的权限状态
    var status = await Permission.phone.status;
    if (status == PermissionStatus.granted) {
//已经授权
      return true;
    } else {
      //未授权则发起一次申请
      status = await Permission.phone.request();
      if (status == PermissionStatus.granted) {
        return true;
      } else {
        return false;
      }
    }
  }
}


http://www.kler.cn/a/416768.html

相关文章:

  • 使用JdbcTemplate 结合预编译预计批量插入数据
  • 手搓一个不用中间件的分表策略
  • 虚拟机VMware安装OpenWrt镜像
  • 拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
  • NeuIPS 2024 | YOCO的高效解码器-解码器架构
  • SQL基础入门——SQL基础语法
  • 数据结构——有序二叉树的构建遍历查找
  • 【iOS】多线程基础
  • 基于R语言森林生态系统结构、功能与稳定性分析与可视化
  • 搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档
  • 面试小札:ThreadLocal底层实现原理和具体应用场景
  • 浅谈JAVA中的Random随机数
  • Linux CentOS:深入探讨端口管理与防火墙配置技巧20241126
  • 蓝队之云技术
  • UE5 打包环境、C++环境安装说明
  • [2024年3月10日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(6))
  • 基础(函数、枚举)错题汇总
  • 深度学习笔记——模型部署
  • docker 在ubuntu系统安装,以及常用命令,配置阿里云镜像仓库,搭建本地仓库等
  • idea_工程与模块管理
  • OSI7层模型和网络排错、网络安全
  • linux下USB设备状态查询
  • 【无标题】JAVA策略模式代码例子
  • Spark和MapReduce场景应用和区别
  • vue3----API
  • JavaFx -- chapter09(网络扫描程序)