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

1 回复

更多关于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}");
});
回到顶部