文章目录
- 前言
- 准备工作
- 一、使用步骤
- 1.使用的插件
- 2.配置权限
- 二、代码示例
- 三、结果截图
前言
flutter在pub.flutter-io.cn插件库中有很多的关于权限配置的插件,但是就我个人而言,比较推荐使用permission_handler这个插件。当我们打开permission_handler时候,往往新手小白会因为它的官网文档而弄的一头雾水,权限配置往往涉及到android和ios两个方向的相关知识,有可能大多数人就只会android或者iOS的某一端知识,在配置权限时出现屡屡不生效的问题。接下来我从零到一教你如何配置吧。
准备工作
flutter版本号:3.0.0
dart版本号:2.12.0
插件:permission_handler
一、使用步骤
1.使用的插件
permission_handler: ^9.0.2
flutter_easyloading: ^3.0.5
2.配置权限
- android
(1)将以下内容添加到“gradle.properties”文件中:(针对androidX及以上的版本)
android.useAndroidX=true
android.enableJetifier=true
(2)将以下内容添加到“AndroidManifest.xml”文件中:(针对androidX及以上的版本)
android:hardwareAccelerated="true"
(3)按需在“AndroidManifest.xml”添加本项目需要用到的权限:(本次以保存图片到本地相册举例)
<!-- 写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 读权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- ios
(1)将以下内容添加到您的文件中:Podfile
post_install do |installer|installer.pods_project.targets.each do |target|... # Here are some configurations automatically generated by flutter# Start of the permission_handler configurationtarget.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.hconfig.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 configurationend
end
(2)删除要使用的权限前面的字符。例如,如果您需要访问相册,请确保代码如下所示:#
## dart: PermissionGroup.photos'PERMISSION_PHOTOS=1',
(3)Info.plist 添加
<!-- 保存图片权限 -->
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Please allow the APP to save photos to the album</string>
二、代码示例
import 'dart:io';import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:permission_handler/permission_handler.dart';class HomePage extends StatefulWidget {const HomePage({Key? key}) : super(key: key);@overrideState<HomePage> createState() => _HomePageState();
}class _HomePageState extends State<HomePage> {/// 动态申请权限,需要区分android和ios,很多时候它两配置权限时各自的名称不同/// 此处以保存图片需要的配置为例Future<bool> requestPermission() async {late PermissionStatus status;// 1、读取系统权限的弹框if (Platform.isIOS) {status = await Permission.photosAddOnly.request();} else {status = await Permission.storage.request();}// 2、假如你点not allow后,下次点击不会在出现系统权限的弹框(系统权限的弹框只会出现一次),// 这时候需要你自己写一个弹框,然后去打开app权限的页面if (status != PermissionStatus.granted) {showCupertinoDialog(context: context,builder: (context) {return CupertinoAlertDialog(title: const Text('You need to grant album permissions'),content: const Text('Please go to your mobile phone to set the permission to open the corresponding album'),actions: <Widget>[CupertinoDialogAction(child: const Text('cancle'),onPressed: () {Navigator.pop(context);},),CupertinoDialogAction(child: const Text('confirm'),onPressed: () {Navigator.pop(context);// 打开手机上该app权限的页面openAppSettings();},),],);});} else {return true;}return false;}// 保存网络图片saveNetworkImg(String imgUrl) async {// Todo// 处理保存网络图片的逻辑EasyLoading.showToast('处理保存网络图片的逻辑');}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('home'),),floatingActionButton: FloatingActionButton(onPressed: () async{// 使用// 首先判断是否有权限,没权限就不执行了bool permission = await requestPermission();permission ? saveNetworkImg('imgUrl') : null;},child: const Icon(Icons.adb),),);}
}
三、结果截图
- android



- ios


