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