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

上一篇:centos系统设置本地yum源教程-1. 下载和准备ISO镜像文件


下一篇:蓝桥杯——递归