欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flutter(Dart)udp组播,本地调试可以成功抓到数据包,但在apk中使用未抓到数据包

程序员文章站 2022-04-27 11:42:22
dart如何实现udp组播,见另一篇:https://blog.csdn.net/qq_41074373/article/details/107463892在项目开发时,在本地可以成功广播,用抓包工具也可以抓到数据包。但是当打包成apk后,在真机上广播,抓包工具没有抓到数据包。后续查询资料知道,要保证app具有联网和gps定位的权限。在AndroidManifast.xml中增加:

dart如何实现udp组播,见另一篇:https://blog.csdn.net/qq_41074373/article/details/107463892

在项目开发时,在本地可以成功广播,用抓包工具也可以抓到数据包。但是当打包成apk后,在真机上广播,抓包工具没有抓到数据包。

引用:https://www.zhihu.com/question/49923081

后续查询资料知道,要保证app具有联网gps定位的权限。

(1)Android 6.0以上调用getScanResults()获取WiFi列表,必须要打开GPS才能获取,否则为空。

是因为6.0之前,APP在不开启GPS定位的情况下,依然可以调用getScanResults获取周边Wifi的相关信息,比如SSID、BSSID、level等,去请求谷歌位置服务器("http://www.google.com/loc/json"),获取用户所在的位置信息;

这显得GPS定位开关毫无意义,显然不合理,是位置权限设计的Bug;

Google出于设计考虑,6.0之后版本,获取WiFi列表必须要设备开启了GPS定位,并且APP具备位置权限,才能获取WiFi列表。

(2) 安卓源码专门判断了是否开启了GPS定位:

Flutter(Dart)udp组播,本地调试可以成功抓到数据包,但在apk中使用未抓到数据包

 

在AndroidManifast.xml中增加:

    <!--  获取运营商信息  -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--用于访问wif网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--  这个权限用于获取wif的获取权限,wifi信息会用来进行网络定位  -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    <!--  请求网络  -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--  后台唤醒定位需要的权限  -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <!--  需要运行时注册的权限  -->
    <!--  用于进行网络定位  -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!--  用于访问GPS定位  -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--  用于提高GPS定位速度  -->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

ps:可在pubspec.yaml中添加以下两个包,检测是否拥有上述权限。

dependencies:
    connectivity: ^0.4.2
    permission_handler: ^3.2.0

检查是否连接wifi:

Future<Null> initConnectivity() async {
    String connectionStatus;
    try {
      connectionStatus = (await _connectivity.checkConnectivity()).toString();
    } on PlatformException catch (e) {
      print(e.toString());
      connectionStatus = '连接失败.';
    }
    if (!mounted) {
      return;
    }
    setState(() {
      _connectionStatus = connectionStatus;
    });
  }

检查是否拥有gps定位权限:

Future<bool> requestPermission() async {
    final permissions = await PermissionHandler().requestPermissions([PermissionGroup.location]);
    print('permissions~~~:$permissions');

    if (permissions[PermissionGroup.location] == PermissionStatus.granted) {
      isHasPermission = '有定位权限';
      print('有定位权限');
      return true;
    } else {
      isHasPermission = '无定位权限';
      print('无定位权限');
      return false;
    }
  }

 

 

本文地址:https://blog.csdn.net/qq_41074373/article/details/107486893