Flutter-- 动态申请权限

配置:请严格配置, 不然会引起这:MissingPluginException(No implementation found for method requestPermissions on channel flutter.baseflow.com/permissions/methods)

Flutter-- 动态申请权限_第1张图片

android.enableJetifier=true
android.useAndroidX=true

Flutter-- 动态申请权限_第2张图片

Flutter-- 动态申请权限_第3张图片

 

添加权限:

Flutter-- 动态申请权限_第4张图片

 

1.引入插件

参考连接  https://pub.dev/packages/permission_handler

#    动态权限申请
permission_handler: '^3.2.0'
#toast
toast: ^0.1.3

2.权限申请和检测

Future requestPermission(BuildContext context) async {
  // 申请权限

  Map permissions =
      await PermissionHandler().requestPermissions([PermissionGroup.storage]);

  // 申请结果  权限检测
  PermissionStatus permission =
      await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);

  if (permission == PermissionStatus.granted) {
    // 参数1:提示消息
// 参数2:提示消息多久后自动隐藏
// 参数3:位置
    Toast.show("权限申请通过!", context,
        duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  } else {
    Toast.show("权限申请被拒绝!", context,
        duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  }
}

3.打开设置页

Future openSetting(BuildContext context) async{
  bool isOpened = await PermissionHandler().openAppSettings();
  if(isOpened){
    Toast.show("打开了设置页!", context,
        duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  }else{
    Toast.show("没打开!", context,
        duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  }
}

4.检测是否点击了禁止询问

Future openRationale(BuildContext context) async{
//  shouldShowRequestPermissionRationale只有当用户同时点选了拒绝开启权限和不再提醒后才会true。
  bool isShown = await PermissionHandler().shouldShowRequestPermissionRationale(PermissionGroup.storage);
  if(isShown){
    Toast.show("isShown!", context,
        duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  }else{
    Toast.show("  no  isShown!", context,
        duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
  }
}

5.正确的使用姿势

//动态申请权限
  Future applyPermission(
      String atcUrl, String atcName, BuildContext context) async {
//    只有当用户同时点选了拒绝开启权限和不再提醒后才会true
    bool isSHow = await PermissionHandler()
        .shouldShowRequestPermissionRationale(PermissionGroup.storage);
    // 申请结果  权限检测
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.storage);

    if (permission != PermissionStatus.granted) {
      //权限没允许
      //如果弹框不在出现了,那就跳转到设置页。
      //如果弹框还能出现,那就不用管了,申请权限就行了
      if (!isSHow) {
        await PermissionHandler().openAppSettings();
      } else {
        await PermissionHandler().requestPermissions([PermissionGroup.storage]);
        //此时要在检测一遍,如果允许了就下载。
        //没允许就就提示。
        PermissionStatus pp = await PermissionHandler()
            .checkPermissionStatus(PermissionGroup.storage);
        if (pp == PermissionStatus.granted) {
          //去下载吧
          downloadFile(atcUrl, atcName);
        } else {
          // 参数1:提示消息// 参数2:提示消息多久后自动隐藏// 参数3:位置
          Toast.show("请允许存储权限,并重试!", context,
              duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
        }
      }
    } else {
      //权限允许了,那就下载吧、
      downloadFile(atcUrl, atcName);
    }
  }

你可能感兴趣的:(Flutter)