App运行时处理权限组(多权限) - Flutter

Handling Permission Group (Multiple Permissions) at App runtime - Flutter

我正在自学/开发具有以下功能的 flutter 应用程序(在线音乐流媒体);

  - Start application at startup (run at startup),
  - Streams music list constantly from internet having total views / played count,
  - Constantly monitor network connectivity.
  - Plays music through bluetooth device (if connected) and pause music when bluetooth device gets disconnected, 
  - Keep the screen alive when my app is in use,
  - Send local and push notifications to the app users,
  - Keep it at exception from Battery Optimization

据我所知,我需要以下权限;-

请使用以上权限名称更正我(如果有误),如果需要的其他权限名称添加到列表中,我将不胜感激。由于缺乏编程背景,我对此不太清楚 - 还没有参加过任何与编程/编码相关的课程。

我试图以权限组的形式请求所需的权限,下面是我的代码示例;-

我使用了 Permission-Handler 包。

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

class PermissionHandlerWidget extends StatefulWidget {
  const PermissionHandlerWidget({Key? key}) : super(key: key);

  @override
  _PermissionHandlerWidgetState createState() => _PermissionHandlerWidgetState();
}

class _PermissionHandlerWidgetState extends State<PermissionHandlerWidget> {

  void checkPermissions() async {

    Map<Permission, PermissionStatus> statuses = await [
      Permission.ignoreBatteryOptimizations,
      Permission.notification,
      Permission.location,
      Permission.bluetooth,
    ].request();
    // perform custom action

  }

  @override
  void initState() {
    // TODO: implement initState
    checkPermissions();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

以上代码仅请求 locationbatteryOptimization 许可。当位置权限被拒绝时,它会请求 batteryOptimzation 权限,但是当 batteryOptimization 权限被拒绝时 - app 总是崩溃 .

此外,

Map<Permission, PermissionStatus> statuses = await [
      Permission.ignoreBatteryOptimizations,
      Permission.notification,
      Permission.location,
      Permission.bluetooth,
    ].request();
    // perform custom action

在上面的代码中,我无法找到我在 AndroidManifest.xml 文件中列出的所有权限。

如果我需要请求个人权限,我在整个互联网上找到了很多示例代码/片段,但我想在 initState() 请求所有相关权限,但得到的例子很少,其中大部分超出了我的理解:).此外,处理 isgranted()isdenied()isdeniedpermanently() 和其他情况 - 也无法得到它。

我知道这对试图帮助/回答的人来说很麻烦,但任何正确的建议都可以帮助我理解并在我的项目中成功实施。

提前致谢!

在这种情况下,对于Android,不需要在清单中声明权限Permission.notification、;然后对于权限 Permission.bluetooth,需要在清单中声明,但未显示为对话框,声明是为了使用设备的蓝牙传感器,并且在这种情况下,第一件事是要求用户打开蓝牙;这些就是为什么在您的 Flutter 应用程序中未显示对话框权限请求的原因。

无论如何,正确的请求权限的方式是在你要使用它们的时候请求它们,而不是同时请求。

如果您这样做,您的应用程序将不会崩溃

  void checkPermissions() async {

Map<Permission, PermissionStatus> statuses = await [
  Permission.ignoreBatteryOptimizations,
].request();
// perform custom action

}

但是更有用和更简洁的方式是这样的:

  void checkPermissions() async {

    var status = await Permission.location.status;
    if(!status.isGranted){
      var status = await Permission.location.request();
      if(status.isGranted){
        var status = await Permission.ignoreBatteryOptimizations.status;
        if(!status.isGranted){
          var status = await Permission.ignoreBatteryOptimizations.request();
          if(status.isGranted){
            //Good, all your permission are granted, do some stuff
          }else{
            //Do stuff according to this permission was rejected
          }
        }
      }else{
        //Do stuff according to this permission was rejected
      }
    }

  }

编码愉快!