Flutter权限管理插件easy_permission的使用
Flutter权限管理插件easy_permission的使用
描述
easy_permission
是一个用于 Flutter 的权限插件,它可以帮助开发者快速、简便地申请权限,避免了繁琐的手动权限请求过程。如果能与 permission_handler
结合使用,效果更佳。
效果如下
代码使用
import 'dart:io';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:easy_permission/easy_permission.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await requestPermissions();
runApp(MyApp());
}
Future<void> requestPermissions() async {
if (Platform.isAndroid) {
List<PermissionType> types = [];
// 申请位置权限
types.add(PermissionType.LOCATION);
// 申请相机权限
types.add(PermissionType.CAMERA);
// 申请存储权限
types.add(PermissionType.STORAGE);
// 申请麦克风权限
types.add(PermissionType.MICROPHONE);
// 申请日历权限
types.add(PermissionType.CALENDAR);
await EasyPermission.requestPermissions(types);
}
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _platformVersion = 'Unknown';
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Text('Running on: \n'),
),
),
);
}
}
对应的权限
enum PermissionType {
INTERNET,
CALENDAR,
CAMERA,
CONTACTS,
MICROPHONE,
LOCATION,
WHEN_IN_USE,
PHONE,
SENSORS,
SMS,
STORAGE,
STATE,
}
注意事项
Android
Android 的权限分为静态权限与动态权限。该插件只能用于动态权限,在 AndroidManifest.xml
文件中需要先进行静态权限申请:
<uses-permission android:name="android.permission.INTERNET" />
<!-- 允许程序设置内置sd卡的读写权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许程序获取网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许程序访问WiFi网络信息 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 允许程序读写手机状态和身份 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 允许程序访问CellID或WiFi热点来获取粗略的位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 允许程序打开相机 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 允许程序打开本地相册 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 用于申请调用A-GPS模块 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
iOS
在 iOS 目录下 Runner
目录下的 info.plist
文件中需要加入以下配置,权限申请必须说明“因为 xxx 功能所以需要 xxx 权限”,不能写“需要拍照所以申请拍照权限”这种描述,否则会被 App Store 因为“元数据问题”而拒绝上架:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
......
<key>NSAppleMusicUsageDescription</key>
<string>需要您提供多媒体访问权限</string>
<key>NSCalendarsUsageDescription</key>
<string>需要您提供日历信息,上传时间</string>
<key>NSCameraUsageDescription</key>
<string>需要您提供相机权限,才能拍照记录信息</string>
<key>NSContactsUsageDescription</key>
<string>需要您提供联系人,才能跟同事沟通</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>需要您提供定位信息,才能使用定位记录您的正确工作轨迹</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>需要您提供后台定位信息,才能使用巡检记录您的正确工作轨迹</string>
<key>NSLocationUsageDescription</key>
<string>需要您提供定位信息,才能使用巡检记录您的正确工作轨迹</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要您提供定位信息,才能使用巡检记录您的正确工作轨迹</string>
<key>NSMotionUsageDescription</key>
<string>需要您提供轨迹,才能使用巡检功能</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要您提供相册访问权限,才能选择相册上传图片</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>需要您提供语音监听,才能使用功能</string>
</dict>
</plist>
更多关于Flutter权限管理插件easy_permission的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter权限管理插件easy_permission的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
easy_permission
是一个用于简化 Flutter 应用中权限管理的插件。它支持 Android 和 iOS 平台,并且提供了简单的 API 来请求和检查权限。以下是如何使用 easy_permission
插件的基本步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 easy_permission
依赖:
dependencies:
flutter:
sdk: flutter
easy_permission: ^0.0.1+1 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化 EasyPermission
在你的 main.dart
文件中,初始化 EasyPermission
:
import 'package:flutter/material.dart';
import 'package:easy_permission/easy_permission.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasyPermission.init();
runApp(MyApp());
}
3. 请求权限
在你的应用中的某个地方,例如在按钮点击事件中,你可以请求权限:
import 'package:flutter/material.dart';
import 'package:easy_permission/easy_permission.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('EasyPermission Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 请求相机权限
bool hasPermission = await EasyPermission.request(
Permission.camera,
);
if (hasPermission) {
print("Camera permission granted");
} else {
print("Camera permission denied");
}
},
child: Text('Request Camera Permission'),
),
),
),
);
}
}
4. 检查权限
你也可以检查是否已经授予了某个权限:
bool hasPermission = await EasyPermission.check(Permission.camera);
if (hasPermission) {
print("Camera permission is granted");
} else {
print("Camera permission is not granted");
}
5. 处理权限请求结果
EasyPermission
提供了 request
方法来请求权限,并返回一个布尔值,表示权限是否被授予。你可以根据这个结果来决定下一步操作。
6. 支持的其他权限
easy_permission
支持多种权限,例如:
Permission.camera
Permission.storage
Permission.location
Permission.microphone
- 等等
你可以在 Permission
枚举中找到所有支持的权限类型。
7. 处理权限被拒绝的情况
如果用户拒绝了权限请求,你可以提示用户去设置中手动开启权限:
if (!hasPermission) {
bool isOpened = await EasyPermission.openAppSettings();
if (isOpened) {
print("App settings opened");
} else {
print("Failed to open app settings");
}
}
8. 处理权限状态
EasyPermission
还提供了 status
方法来获取权限的当前状态:
PermissionStatus status = await EasyPermission.status(Permission.camera);
print(status);
PermissionStatus
可以是 granted
, denied
, restricted
, permanentlyDenied
等。
9. 处理权限变化的回调
你可以监听权限状态的变化:
EasyPermission.onPermissionChange.listen((PermissionEvent event) {
print("Permission changed: ${event.permission} - ${event.status}");
});