Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振连接包:Android权限_Flutter_Wifi - Fatal编程技术网

Flutter 颤振连接包:Android权限

Flutter 颤振连接包:Android权限,flutter,wifi,Flutter,Wifi,我在一个颤振应用程序中使用了来自的示例代码,当在Android模拟器上运行该应用程序时,该应用程序会看到调试wi-fi网络。但是,当我在像素4XL上运行应用程序时,wi-fi名称和BSSID为空 我假设我必须启用访问Wi-Fi设置的权限才能使用此软件包,但我在任何地方都找不到任何描述颤振上此软件包所需内容的参考 我使用wi-fi软件包示例中的wi-fi权限更新了Android应用程序appmanifest文件,但我的应用程序中没有任何更改 我创建了一个示例应用程序来演示解决方案,但显然堆栈溢出的

我在一个颤振应用程序中使用了来自的示例代码,当在Android模拟器上运行该应用程序时,该应用程序会看到调试wi-fi网络。但是,当我在像素4XL上运行应用程序时,wi-fi名称和BSSID为空

我假设我必须启用访问Wi-Fi设置的权限才能使用此软件包,但我在任何地方都找不到任何描述颤振上此软件包所需内容的参考


我使用wi-fi软件包示例中的wi-fi权限更新了Android应用程序appmanifest文件,但我的应用程序中没有任何更改

我创建了一个示例应用程序来演示解决方案,但显然堆栈溢出的人希望我更加努力地与您共享此信息。他们删除了我的原始答案(尽管它为每个有问题的人解决了问题)。我想把答案的一部分拿出来,贴在这里。我做了很多工作来解决这个问题,并将其作为一个完整的应用程序示例发布,但显然这还不够。我讨厌这个。我试图帮助人们,但他们不喜欢外部引用解决方案

我创建了一个完整的解决方案,演示了如何在中解决此问题

颤振似乎无法查询应用程序用户的权限,因此有人创建了颤振包。将其添加到我的应用程序中,以及原始版本中显示的代码变体,解决了我的问题

我很快意识到关于颤振回购的答案是不完整的,任何试图实施此解决方案的人都需要一些帮助。为了让这些开发人员更容易,我在这个repo中创建了一个完整的示例应用程序

这就是我所做的

从项目的
pubspec.yaml
文件开始,我添加了连接和权限处理程序包:

依赖项:
颤振:
sdk:颤振
cupertino_图标:^0.1.3
连接:^0.4.8+6
权限处理程序:^5.0.1
接下来,我将导入添加到项目的
main.dart
文件中:

import'包:连接性/连接性.dart';
导入“package:permission_handler/permission_handler.dart”;
然后我向
initConnectivity
函数添加了一些代码:

Future initConnectivity()异步{
连接结果;
//平台消息可能会失败,因此我们使用try/catch PlatformException。
试一试{
结果=等待连接。检查连接();
}平台上异常捕获(e){
打印(如toString());
}
//如果在异步平台运行时从树中删除了小部件
//消息正在传输中,我们希望放弃回复而不是呼叫
//设置state以更新我们不存在的外观。
如果(!已安装){
返回Future.value(空);
}
//检查Android位置权限是否已启用
//描述于https://github.com/flutter/flutter/issues/51529
if(Platform.isAndroid){
打印(“检查Android权限”);
var status=等待权限.location.status;
//封锁?
如果(status.isUndefined | | | status.isDenied | | | status.isRestricted){
//要求用户解除阻止
if(等待权限.location.request().isgrated){
//该权限以前已授予,或者用户刚刚授予。
打印(“授予位置许可”);
}否则{
打印(“未授予位置权限”);
}
}否则{
打印('已授予的权限(以前的执行?);
}
}
返回_updateConnectionStatus(结果);
}
我添加的代码是:

//检查是否启用了Android位置权限
//描述于https://github.com/flutter/flutter/issues/51529
if(Platform.isAndroid){
打印(“检查Android权限”);
var status=等待权限.location.status;
//封锁?
如果(status.isUndefined | | | status.isDenied | | | status.isRestricted){
//要求用户解除阻止
if(等待权限.location.request().isgrated){
//该权限以前已授予,或者用户刚刚授予。
打印(“授予位置许可”);
}否则{
打印(“未授予位置权限”);
}
}否则{
打印('已授予的权限(以前的执行?);
}
}
此代码在启动时执行一次,并在从设备检索连接状态之前检查权限

如果此时运行代码,一切似乎都正常,但Wi-Fi名称、BSSID和IP地址的值都将报告
null
。当您查看控制台时,您将看到:

I/flutter ( 6506): Checking Android permissions
I/flutter ( 6506): Result: ConnectivityResult.wifi
D/permissions_handler( 6506): No permissions found in manifest for: 3
I/flutter ( 6506): Wi-Fi Name: null
D/permissions_handler( 6506): No permissions found in manifest for: 3
I/flutter ( 6506): Location permission not granted
I/flutter ( 6506): Result: ConnectivityResult.wifi
I/flutter ( 6506): BSSID: 02:00:00:00:00:00
I/flutter ( 6506): Wi-Fi Name: null
I/flutter ( 6506): BSSID: 02:00:00:00:00:00
这是因为没有在应用程序中定义正确的权限,
status
值为
null
,并且没有其他权限检查内容发生。用户甚至从未像预期的那样被请求权限

要解决此问题,请打开项目的
android/app/src/main/AndroidManifest.xml
文件,并将位置权限添加到应用程序的配置中:


我用的是球场设置,我想你也可以用罚款

很多时候,编写器会告诉您要进行哪些权限更改,但不会告诉您应该在文件中的什么位置进行更改。我没有做很多本地Android开发,所以我不知道该将该设置放在哪里,所以这里是完整的文件列表,您可以看到它的正确位置:


当您在Android API 29上启动应用程序时,它看起来如下所示:

对于我的特定应用程序,我不关心在应用程序未运行时从设备获取设置,因此我选择了“仅在使用应用程序时允许”。如果查看控制台,您将看到以下内容:

I/flutter ( 7670): Checking Android permissions
I/flutter ( 7670): Result: ConnectivityResult.wifi
I/flutter ( 7670): Wi-Fi Name: null
I/flutter ( 7670): BSSID: 02:00:00:00:00:00
I/flutter ( 7670): Location permission granted
I/flutter ( 7670): Result: ConnectivityResult.wifi
I/flutter ( 7670): Wi-Fi Name: AndroidWifi
I/flutter ( 7670): BSSID: 02:15:b2:00:01:00
请注意,应用程序在等待用户授予权限时会继续检查Wi-Fi设置;那是因为