最简单的Flutter权限管理插件

2021-05-06 10:20:25 浏览数 (1)

@toc

这是Flutter上的一个动态权限处理的插件库,可以让Flutter应用层的开发者以非常简单的API统一处理原生的动态权限。它封装了关于权限的检查、请求,以及权限被永久拒绝时,适当的拉起系统设置页面,提示用户手动打开权限。几乎想不到拒绝使用它的理由。

仓库地址: flutter_easy_permission

  • Android
  • iOS

用法

  1. 配置权限
  2. 检查权限。当调用一些需要权限的API时,应先检查是否具有相关权限
  3. 请求权限。如果未获得授权,则向用户请求这些权限
  4. 处理回调

配置权限

Android

在项目根目录中打开android/app/src/main/AndroidManifest.xml文件,然后配置所需的权限:

代码语言:txt复制
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xyz.bczl.flutter.easy_permission_example">
    <!--  在此处配置权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
   <application
        android:label="flutter_easy_permission_example"
        android:icon="@mipmap/ic_launcher">
        <!--  .............  -->
   </application>
</manifest>

有关这些常量的详细说明,请转到这里。

要了解Android上的权限是如何处理的,这里有一份完整文档。

iOS

打开项目根目录下的ios/Runner/Info.plist文件,配置你需要的权限:

代码语言:txt复制
<?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>NSCameraUsageDescription</key>
	<string>在此向用户解释你为什么需要这个权限</string>

    <!--  .............  -->
</dict>
</plist>

注意,替换<string></string>标签中的内容,给用户一个需要权限的理由。

关于iOS权限的详细解释,你可以查看这里。

这个插件包装了一个用于iOS的LBXPermission库。集成iOS中未使用的权限库,可能无法通过应用商店审核,所以不要集成那些不用的权限库,因此你还需要做一些配置。

打开ios/Podfile文件,添加以下代码。

代码语言:txt复制
target 'Runner' do
  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  # Add the library of permissions you need here
  pod 'LBXPermission/Camera'
end

你可以集成的库:

代码语言:txt复制
pod 'LBXPermission/Camera'
pod 'LBXPermission/Photo'
pod 'LBXPermission/Contact'
pod 'LBXPermission/Location'
pod 'LBXPermission/Reminder'
pod 'LBXPermission/Calendar'
pod 'LBXPermission/Microphone'
pod 'LBXPermission/Health'
pod 'LBXPermission/Net'
pod 'LBXPermission/Tracking'
pod 'LBXPermission/Notification'
pod 'LBXPermission/Bluetooth'

配置好后,你需要在项目的ios目录下运行安装命令:

代码语言:txt复制
pod install

检查权限

代码语言:txt复制
const permissions = [Permissions.CAMERA];
const permissionGroup = [PermissionGroup.Camera];

bool ret = await FlutterEasyPermission.has(perms: permissions,permsGroup: permissionGroup);

由于Android和iOS的权限有很大不同,很难统一处理,所以你必须分别处理。参数perms对应的是Android权限,参数permsGroup对应的是iOS权限。app同一时间只能在一个平台上运行,所以你不需要担心会出现混乱。

注意API和库之间的关系,要检查和请求相关的权限,你必须集成相应的库,见下表:

PermissionGroup

Info.plist

Integrated lib

Calendar

NSCalendarsUsageDescription

LBXPermission/Calendar

Reminders

NSRemindersUsageDescription

LBXPermission/Reminder

Contacts

NSContactsUsageDescription

LBXPermission/Contact

Camera

NSCameraUsageDescription

LBXPermission/Camera

Microphone

NSMicrophoneUsageDescription

LBXPermission/Microphone

Photos

NSPhotoLibraryUsageDescription

LBXPermission/Photo

Location

NSLocationUsageDescription NSLocationAlwaysAndWhenInUseUsageDescription NSLocationWhenInUseUsageDescription

LBXPermission/Location

Notification

PermissionGroupNotification

LBXPermission/Notification

Bluetooth

NSBluetoothAlwaysUsageDescription NSBluetoothPeripheralUsageDescription

LBXPermission/Bluetooth

请求权限

代码语言:txt复制
FlutterEasyPermission.request(
                    perms: permissions,permsGroup: permissionGroup,rationale:"Test permission requests here");

处理回调

代码语言:txt复制
void initState() {
    super.initState();
    _easyPermission = FlutterEasyPermission()
      ..addPermissionCallback(
        onGranted: (requestCode,perms,perm){
          debugPrint("Android Authorized:$perms");
          debugPrint("iOS Authorized:$perm");
        },
        onDenied: (requestCode,perms,perm,isPermanent){
          if(isPermanent){
            FlutterEasyPermission.showAppSettingsDialog(title: "Camera");
          }else{
            debugPrint("Android Deny authorization:$perms");
            debugPrint("iOS Deny authorization:$perm");
          }
        },);
  }

void dispose() {
    _easyPermission.dispose();
    super.dispose();
}

isPermanent返回true时,表明系统在请求权限时不会弹出授权对话框,所以你可能需要自己弹出一个对话框,内容主要是提示用户,如果你必须使用这个功能,你可以到系统设置页面重新打开权限。

在Android上,你可能还需要实现onSettingsReturned回调函数,以更好地处理权限交互。它是showAppSettingsDialog被调用后的回调。

例子

一个完整的例子, 查看 这里

您还可以查看它在flutter-scankit中的使用示例

插件开发

如果您对Flutter插件开发内容感兴趣,可以去我的网校中查看《Flutter全栈式开发-高级篇》的课程,全网独家深入解析关于Flutter插件开发的方方面面,实战讲解多个案例(包含本插件开发过程)

欢迎关注公众号:编程之路从0到1

0 人点赞