Flutter开发之动态权限的使用

 更新时间:2021年09月27日 11:31:27   作者:xiangzhihong8  
众所周知,Android在6.0版本后将权限修改成了动态权限,而iOS则一直使用的是动态权限,所以在Flutter应用开发中如果涉及到一些危险权限,就需要进行动态申请,本文就详细的介绍一下,感兴趣的可以了解一下

众所周知,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 动态权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android ScrollView的顶部下拉和底部上拉回弹效果

    Android ScrollView的顶部下拉和底部上拉回弹效果

    本篇文章主要介绍了Android ScrollView的顶部下拉和底部上拉回弹效果,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Android使用ViewPager实现翻页效果

    Android使用ViewPager实现翻页效果

    这篇文章主要为大家详细介绍了Android使用ViewPager实现翻页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Android编程使用android-support-design实现MD风格对话框功能示例

    Android编程使用android-support-design实现MD风格对话框功能示例

    这篇文章主要介绍了Android编程使用android-support-design实现MD风格对话框功能,涉及Android对话框、视图、布局相关操作技巧,需要的朋友可以参考下
    2017-01-01
  • Android View事件分发机制详解

    Android View事件分发机制详解

    这篇文章主要为大家详细介绍了Android View事件分发机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Listview的异步加载性能优化

    Listview的异步加载性能优化

    Android中ListView是使用平率最高的控件之一(GridView跟ListView是兄弟,都是继承AbsListView),ListView优化最有效的无非就是采用ViewHolder来减少频繁的对view查询和更新,缓存图片加快解码,减小图片尺寸
    2016-01-01
  • RecyclerView的简单使用

    RecyclerView的简单使用

    这篇文章主要为大家详细介绍了RecyclerView的简单使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android自定义AvatarImageView实现头像显示效果

    Android自定义AvatarImageView实现头像显示效果

    这篇文章主要为大家详细介绍了Android自定义AvatarImageView实现头像显示效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Android基于wheelView实现自定义日期选择器

    Android基于wheelView实现自定义日期选择器

    这篇文章主要为大家详细介绍了Android基于wheelView实现自定义日期选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 浅析Android手机卫士关闭自动更新

    浅析Android手机卫士关闭自动更新

    保存数据的四种方式,网络,广播提供者,SharedPreferences,数据库。接下来通过本文给大家介绍android手机卫士关闭自动更新的相关知识,感兴趣的朋友一起学习吧
    2016-04-04
  • Kotlin协程低级api startCoroutine与ContinuationInterceptor

    Kotlin协程低级api startCoroutine与ContinuationInterceptor

    这篇文章主要为大家介绍了Kotlin协程低级api startCoroutine与ContinuationInterceptor示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论