前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最简单的Flutter权限管理插件

最简单的Flutter权限管理插件

原创
作者头像
arcticfox
修改2021-05-06 10:20:25
1.7K0
修改2021-05-06 10:20:25
举报

@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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 用法
    • 配置权限
      • Android
      • iOS
    • 检查权限
      • 请求权限
        • 处理回调
        • 例子
        • 插件开发
        • 欢迎关注公众号:编程之路从0到1
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档