在应用程序运行时处理权限组(多个权限)- 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

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

  • android.permission.INTERNET
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.BLUETOOTH
  • android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • android.permission.ACCESS_NOTIFICATIONS
  • android.permission.WAKE_LOCK

请更正我以上权限名称(如果错误),如果需要额外的权限名称添加到列表中,我将不胜感激。由于缺乏编程背景,我对这个问题没有很清楚的认识——我还没有参加过任何与编程/编码相关的课程。

我尝试以权限组的身份请求所需的权限,下面是我的代码示例;-

我用的是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权限被拒绝时-应用程序一直崩溃.

此外,

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,不需要在舱单上申报;然后为permissionpermission .bluetooth,需要在manifest中声明,但不显示为对话框,是为了使用设备的蓝牙传感器而声明的,在这种情况下的第一件事是要求用户打开蓝牙;这就是为什么在你的应用中没有显示权限请求对话框的原因。

无论如何,请求许可的正确方法是在你将要使用它们的时候请求它们,而不是同时请求它们。

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

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
}
}
}

编码快乐!

在permission_handler: ^10.2.0版本中,我们可以处理一组权限,如

。请求权限

Map<Permission, PermissionStatus> statuses = await [
Permission.location,
Permission.camera,
Permission.sms,
Permission.storage,
].request();

二世。检查权限

statuses.values.forEach((element) async {
if (element.isDenied || element.isPermanentlyDenied) {
await openAppSettings();
}

});

iii。在init状态下调用

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

第四。所有代码

void requestPermission() async {
Map<Permission, PermissionStatus> statuses = await [
Permission.location,
Permission.camera,
Permission.sms,
Permission.storage,
].request();
statuses.values.forEach((element) async {
if (element.isDenied || element.isPermanentlyDenied) {
await openAppSettings();
}

});
}

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

permissionHandler

最新更新