众所周知,Android在6.0版本后将权限修改成了动态权限,而iOS则一直使用的是动态权限,所以在Flutter应用开发中如果涉及到一些危险权限,就需要进行动态申请,动态申请权限可以使用Flutter的permission_handler。
基本使用
1,配置权限
首先,打开Android工程下的AndroidManifest.xml文件,具体路径如下:在android\app\src\main\AndroidManifest.xml中配置,然后添加如下所示的权限。
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-     package="com.example.kill_attendance">
-         <!-- 申请Android权限-->
-     <!--网络访问-->
-     <uses-permission android:name="android.permission.INTERNET" />
-     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-  
-     <!-- Permissions options for the `contacts` group -->
-     <uses-permission android:name="android.permission.READ_CONTACTS" />
-     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
-     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
-  
-     <!-- Permissions options for the `storage` group -->
-     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-  
-     <!-- Permissions options for the `camera` group -->
-     <uses-permission android:name="android.permission.CAMERA" />
-  
-     <!-- Permissions options for the `location` group -->
-     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-     <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
-  
-     <!-- Permissions options for the `microphone` or `speech` group -->
-     <uses-permission android:name="android.permission.RECORD_AUDIO" />
-          <!-- app名称,图标 -->
-     <application
-         android:name="io.flutter.app.FlutterApplication"
-         android:label="应用名称"
-         android:icon="@mipmap/icon">
-         <activity
-             android:name=".MainActivity"
-             android:launchMode="singleTop"
-             android:theme="@style/LaunchTheme"
-             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
-             android:hardwareAccelerated="true"
-             android:windowSoftInputMode="adjustResize">
-             <!-- This keeps the window background of the activity showing
-                  until Flutter renders its first frame. It can be removed if
-                  there is no splash screen (such as the default splash screen
-                  defined in @style/LaunchTheme). -->
-             <meta-data
-                 android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
-                 android:value="true" />
-             <intent-filter>
-                 <action android:name="android.intent.action.MAIN"/>
-                 <category android:name="android.intent.category.LAUNCHER"/>
-             </intent-filter>
-         </activity>
-     </application>
- </manifest>
 
动态权限申请
目前,这个插件已经升级了好几版,而不同版本处理方法也不一样,特别是最新的5.0.0版本和之前的版本,用法差别比较大。
4.3.0
例如,下面是4.3.0版本的用法:
    - 权限列表:PermissionGroup中的字段
- 权限状态列表:PermissionStatus中字段
- 打开权限设置页面:await PermissionHandler().openAppSettings();
- 申请权限
示例如下:
- await Map<PermissionGroup, PermissionStatus> map= PermissionHandler().requestPermissions([ 权限列表])
 
然后,是获取申请权限的状态,如下:
- PermissionStatus contactsPermStatus = await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
 
下面是一个完整的示例:
-   ///请求权限
-   void _requestPermission() async {
-     debugPrint("进入闪屏页面");
-     // 申请权限
-     // PermissionStatus storageStatus ;
-     PermissionStatus cameraStatus;
-  
-      await PermissionHandler().requestPermissions(
-           [ PermissionGroup.camera]).then((value) {
-              debugPrint("返回:$value");
-             // storageStatus=value[PermissionGroup.storage];
-             cameraStatus=value[PermissionGroup.camera];
-           });
-     debugPrint("请求权限,并获取权限:$cameraStatus");
-  
-     //校验权限
-     if (cameraStatus == PermissionStatus.granted) {
-       debugPrint("校验权限:用户都同意了");
-       //用户都同意了(用&&)
-       ///权限都申请成功初始化闪屏
-       _initSplash();
-     } else if ( cameraStatus == PermissionStatus.denied) {
-       debugPrint("校验权限:有任何一组权限被用户拒绝");
-       //用户拒绝了(用||)
-       ///有任何一组权限被用户拒绝
-       //拼接提示权限文本
-       StringBuffer sb = new StringBuffer();
-       sb.write(cameraStatus == PermissionStatus.denied ? "相机," : "");
-       String tip = Utils.removePostfix(sb.toString(), ",");
-  
-       Utils.showCustomDialog(
-           context,
-           ConfirmDialog(
-             "您拒绝了应用的必要权限:\n[$tip],是否重新申请?",
-             canBackDismiss: false,
-             confirmCallback: () => _requestPermission(),
-             cancelCallback: () => SystemNavigator.pop(),
-           ));
-     } else if (  cameraStatus == PermissionStatus.neverAskAgain) {
-       debugPrint("校验权限:有权限永久拒绝");
-       //有权限永久拒绝(用||)
-       ///有任何一组权限选了不再提示
-       //拼接提示权限文本
-       StringBuffer sb = new StringBuffer();
-       sb.write(cameraStatus == PermissionStatus.neverAskAgain ? "相机," : "");
-       String tip = Utils.removePostfix(sb.toString(), ",");
-  
-       Utils.showCustomDialog(
-           context,
-           ConfirmDialog(
-             "您禁用了应用的必要权限:\n[$tip],请到设置里允许?",
-             canBackDismiss: false,
-             confirmText: "去设置",
-             confirmCallback: () async {
-               await PermissionHandler().openAppSettings(); //打开设置页面
-               SystemNavigator.pop();
-             },
-             cancelCallback: () => SystemNavigator.pop(),
-           ));
-     }
-  
-   }
 
5.0.0
5.0.0版本和之前的写法大体类似,只是方法和参数字段发生了改变,如下所示。
    - 权限列表:Permission中的字段
- 权限状态列表:PermissionStatus中字段
- 打开权限设置页面:openAppSettings();
- 申请权限
- await [权限列表].request();   //可以使用then,用权限获取状态
 
获取权限状态await Permission.camera.status
判断权限状态:await Permission.camera.isDenied|isGranted等
下面是详细的使用示例:
-   ///请求权限
-   void _requestPermission() async {
-     debugPrint("进入闪屏页面");
-     // 申请权限
-     // PermissionStatus cameraStatus;
-  
-     await [Permission.camera].request();
-     // .then((value){
-       //设置申请后的结果
-         // cameraStatus=value[Permission.camera];
-       // });
-     //或者直接调用:
-     debugPrint("请求权限,并获取权限");
-     if(await Permission.camera.isDenied){
-  
-     }
-     
-     //校验权限
-     if (await Permission.camera.isGranted) {
-       debugPrint("校验权限:用户都同意了");
-       //用户都同意了(用&&)
-       ///权限都申请成功初始化闪屏
-       _initSplash();
-     } else if ( await Permission.camera.isDenied) {
-       debugPrint("校验权限:有任何一组权限被用户拒绝");
-       //用户拒绝了(用||)
-       ///有任何一组权限被用户拒绝
-       //拼接提示权限文本
-       StringBuffer sb = new StringBuffer();
-       sb.write(await Permission.camera.isDenied? "相机," : "");
-       String tip = Utils.removePostfix(sb.toString(), ",");
-  
-       Utils.showCustomDialog(
-           context,
-           ConfirmDialog(
-             "您拒绝了应用的必要权限:\n[$tip],是否重新申请?",
-             canBackDismiss: false,
-             confirmCallback: () => _requestPermission(),
-             cancelCallback: () => SystemNavigator.pop(),
-           ));
-     } else if ( await Permission.camera.isPermanentlyDenied) {
-       debugPrint("校验权限:有权限永久拒绝");
-       //有权限永久拒绝(用||)
-       ///有任何一组权限选了不再提示
-       //拼接提示权限文本
-       StringBuffer sb = new StringBuffer();
-       sb.write( await Permission.camera.isPermanentlyDenied ? "相机," : "");
-       String tip = Utils.removePostfix(sb.toString(), ",");
-  
-       Utils.showCustomDialog(
-           context,
-           ConfirmDialog(
-             "您禁用了应用的必要权限:\n[$tip],请到设置里允许?",
-             canBackDismiss: false,
-             confirmText: "去设置",
-             confirmCallback: () async {
-               await openAppSettings(); //打开设置页面
-               SystemNavigator.pop();
-             },
-             cancelCallback: () => SystemNavigator.pop(),
-           ));
-     }
-  
-   }
 
参考: permission_handler
到此这篇关于Flutter开发之动态权限的使用的文章就介绍到这了,更多相关Flutter 动态权限内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!