仓库地址: 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
你可以集成的库:
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目录下运行安装命令:
pod install
检查权限
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 |
请求权限
FlutterEasyPermission.request(
perms: permissions,permsGroup: permissionGroup,rationale:"Test permission requests here");
处理回调
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中的使用示例