Flutter(Dart)udp组播,本地调试可以成功抓到数据包,但在apk中使用未抓到数据包
dart如何实现udp组播,见另一篇:https://blog.csdn.net/qq_41074373/article/details/107463892
在项目开发时,在本地可以成功广播,用抓包工具也可以抓到数据包。但是当打包成apk后,在真机上广播,抓包工具没有抓到数据包。
后续查询资料知道,要保证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定位:
在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
上一篇: 六问网站优化过程中的常见错误
下一篇: 地方快餐店的微信营销案例