简体   繁体   English

如何向 flutter 中的用户请求多个权限?

[英]How to ask multiple permissions from user in flutter?

I was asked permission from the user in runtime but I need to ask MULTIPLE permissions for example phone, contact, SMS, etc so I'm stuck on that how to call this method one after another is there any way to ask after one permission completed another popup open?我在运行时被要求获得用户的许可,但我需要获得多个权限,例如电话、联系人、短信等,所以我一直坚持如何一个接一个地调用这个方法,有没有办法在一个权限完成后询问另一个弹出窗口打开?

      import 'package:permission_handler/permission_handler.dart';

       class PermissionService{
         final PermissionHandler _permissionHandler = PermissionHandler();

         Future<bool> _requestPermissionContact(PermissionGroup permission) async {
           var result = await _permissionHandler.requestPermissions([permission]);
           if (result[PermissionGroup.contacts] == PermissionStatus.granted) {
             print("sfhalsjfhas fasdhufaiusfh aloifahdf oalsifu");
           }

         }


         Future<bool> requestContactPermission({Function onPermissionDenied}) async {
           var granted = await _requestPermissionContact(PermissionGroup.contacts);
           if (!granted) {
             onPermissionDenied();
           }
           return granted;
         }

         Future<bool> hasContactPermission() async {
            return hasPermission(PermissionGroup.contacts);
         }

         Future<bool> _requestPermissionSms(PermissionGroup permission) async {
           var result = await _permissionHandler.requestPermissions([permission]);
           if (result[permission] == PermissionStatus.granted) {
             print("sfhalsjfhas fasdhufaiusfh aloifahdf oalsifu");
             return true;
           }
           return false;
         }

         Future<bool> requestSmsPermission({Function onPermissionDenied}) async {
           var granted = await _requestPermissionSms(PermissionGroup.sms);
           if (!granted) {
             onPermissionDenied();
           }
           return granted;
         }

         Future<bool> hasSmsPermission() async {
           _requestPermissionPhone(PermissionGroup.phone);
           return hasPermission(PermissionGroup.sms);
         }

         Future<bool> _requestPermissionPhone(PermissionGroup permission) async {
           var result = await _permissionHandler.requestPermissions([permission]);
           if (result[permission] == PermissionStatus.granted) {
             return true;
           }
           return false;
         }

         Future<bool> requestPhonePermission({Function onPermissionDenied}) async {
           var granted = await _requestPermissionPhone(PermissionGroup.phone);
           if (!granted) {
             onPermissionDenied();
           }
           return granted;
         }

         Future<bool> hasPhonePermission() async {
           return hasPermission(PermissionGroup.phone);
         }

         Future<bool> hasPermission(PermissionGroup permission) async {
           var permissionStatus =
           await _permissionHandler.checkPermissionStatus(permission);
           return permissionStatus == PermissionStatus.granted;
         }
       }    

this is my permission class i want to call this three permission and in initState i was called this like这是我的权限 class 我想调用这三个权限,在 initState 中我被称为这样

    @override
    initState() {

    permissionAcess();
    permissionAcessSms();
    permissionAcessPhone();

    super.initState();
  }


  Future permissionAcess() {
    PermissionService().requestContactPermission(onPermissionDenied: () {
      print('Permission has been denied');
    });
  }

  Future permissionAcessSms() {
    PermissionService().requestSmsPermission(onPermissionDenied: () {
      print('Permission has been denied');
    });
  }

  Future permissionAcessPhone() {
    PermissionService().requestPhonePermission(onPermissionDenied: () {
      print('Permission has been denied');
    });
  }          

but it called only one permission so how to call all these three permission in runtime?但是它只调用了一个权限那么如何在运行时调用所有这三个权限呢?

yes you can ask multiple permission at same time just update your code like this your PermissionServices file will be是的,您可以同时请求多个权限,只需像这样更新您的代码,您的 PermissionServices 文件将是

   import 'package:permission_handler/permission_handler.dart';

   class PermissionService{
     final PermissionHandler _permissionHandler = PermissionHandler();

     Future<bool> _requestPermission() async {
       var result = await _permissionHandler.requestPermissions([PermissionGroup.phone,PermissionGroup.contacts,PermissionGroup.sms]);
       if (result == PermissionStatus.granted) {
         return true;
       }
       return false;
     }

     Future<bool> requestPermission({Function onPermissionDenied}) async {
       var granted = await _requestPermission();
       if (!granted) {
         onPermissionDenied();
       }
       return granted;
     }

     Future<bool> hasPhonePermission() async {
       return hasPermission(PermissionGroup.phone);
     }

     Future<bool> hasPermission(PermissionGroup permission) async {
       var permissionStatus =
       await _permissionHandler.checkPermissionStatus(permission);
       return permissionStatus == PermissionStatus.granted;
     }
   }  

and your initState will be你的 initState 将是

  @override
  initState(){
    permissionAcessPhone();
    super.initState();
  }

  Future permissionAcessPhone() {
     PermissionService().requestPermission(onPermissionDenied: () {
        print('Permission has been denied');
     });
  }     

In earliar version of permission handler we can hande multiple permission at a same time permission_handler 10.2.0在早期版本的权限处理程序中,我们可以同时处理多个权限permission_handler 10.2.0

    List<Permission> statuses = [
    Permission.location,
    Permission.camera,
    Permission.sms,
    Permission.storage,
  ];
  Future<void> requestPermission() async {
    try {
      for (var element in statuses) {
        if ((await element.status.isDenied ||
            await element.status.isPermanentlyDenied)) {
          await statuses.request();
        }
      }
    } catch (e) {
      debugPrint('$e');
    } finally {
      await requestPermission();
    }
  }

  @override
  void initState() {
    requestPermission();
    super.initState();
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM