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
据我所知,我需要以下权限;-
- 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();
}
}
以上代码仅请求 location
和 batteryOptimization
许可。当位置权限被拒绝时,它会请求 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
}
}
}
编码愉快!
我正在自学/开发具有以下功能的 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();
}
}
以上代码仅请求 location
和 batteryOptimization
许可。当位置权限被拒绝时,它会请求 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
}
}
}
编码愉快!