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上:精细和粗略定位 | 核心定位-始终 当请求此权限时,用户需要首先授予“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;
}
}
}
}