@toc
这是Flutter上的一个动态权限处理的插件库,可以让Flutter应用层的开发者以非常简单的API统一处理原生的动态权限。它封装了关于权限的检查、请求,以及权限被永久拒绝时,适当的拉起系统设置页面,提示用户手动打开权限。几乎想不到拒绝使用它的理由。
仓库地址: flutter_easy_permission
- Android
- iOS
用法
- 配置权限
- 检查权限。当调用一些需要权限的API时,应先检查是否具有相关权限
- 请求权限。如果未获得授权,则向用户请求这些权限
- 处理回调
配置权限
Android
在项目根目录中打开android/app/src/main/AndroidManifest.xml
文件,然后配置所需的权限:
<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
文件,配置你需要的权限:
<?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
文件,添加以下代码。
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 |
| LBXPermission/Calendar |
Reminders |
| LBXPermission/Reminder |
Contacts |
| LBXPermission/Contact |
Camera |
| LBXPermission/Camera |
Microphone |
| LBXPermission/Microphone |
Photos |
| LBXPermission/Photo |
Location |
| LBXPermission/Location |
Notification |
| LBXPermission/Notification |
Bluetooth |
| 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插件开发的方方面面,实战讲解多个案例(包含本插件开发过程)