Flutter 获取手机连接的Wifi信息
- 测试版本
- Flutter:3.7.6
- Dart:2.19.3
network_info_plus: 4.0.1
前言
我在做设备配网的时候,需要选择配网的WiFi。用下拉选择框展示WiFi列表。现在有个需求:默认展示的设备为手机连接的wifi。要实现这个需求只要能够获取到手机连接的wifi信息即可。
在这里我使用的库是network_info_plus 。这个库适用于Android、iOS、MacOS、Windows。可以获取连接WiFi的名称、BSSID、IPV4、IPV6、网关、广播、子任务
在获取Wifi信息时需要获取设备的定位才能成功,因此我需要使用permission_handler来进行权限申请
pub地址:network_info_plus | Flutter package
github地址:https://github.com/fluttercommunity/plus_plugins/tree/main/packages/network_info_plus/network_info_plus
Network_info_plus的API
函数 | 描述 | 举例 | 备注 |
---|---|---|---|
getWifiSubmask() | 获取的设备的子网掩码 |
| |
getWifiName() | 获取WiFi的名称 |
| 经测试发现Android会有双引号,ios没有双引号 |
getWifiIPv6() | 获取Wifi的IPV6 |
| |
getWifiIP() | 获取Wifi的IPV4 |
| |
getWifiGatewayIP() | 获取设备的网关地址 |
| |
getWifiBSSID() | 获取WiFi的BSSID |
| |
getWifiBroadcast(); | 获取设备的广播地址 |
| |
NetworkInfo(); | 初始化Network_info_plus |
使用步骤
1.下载Network_info_plus包
flutter pub add network_info_plus
2.权限配置
Android权限配置
配置要求
- Android 10(API 级别 29)SDK 或更高版本,则您的应用需要具有 ACCESS_FINE_LOCATION 权限
- 低于 Android 10(API 级别 29),则您的应用需要具有 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限
- 设备上启用了位置服务(在“设置”>“位置”下)
- 如果您使用 Android 12(API 级别 31)及更高版本的设备,请确保您的应用具有 ACCESS_NETWORK_STATE 权限
- 默认情况下,此包不提供 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限
具体配置
1.进入项目根目录/android/app/src/main/AndroidManifest.xml中添加以下权限
<!-- required for API 23 - 30 定位服务权限--><uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" /><uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.在代码中获取定位权限
var status = await Permission.location.status;if (!status.isGranted) {await Permission.location.request();}
3.验证是否成功
在Flutter中添加如下代码进行测试
getPhoneConnectWifiName() async { var info = NetworkInfo();String? wifiName = await info.getWifiName();print("-------------手机连接的wifi名称为:$wifiName");var status = await Permission.location.status;if (!status.isGranted) {await Permission.location.request();}wifiName = await info.getWifiName();print("-------------手机连接的wifi名称为:$wifiName");}
iOS权限配置
1.下载的证书中应该包含Access Wi-Fi Information
2.打开xcode,点击TARGETS下的项目——>点击Signing&Capablities——>点击All
3.点击加号——>在搜索框中搜索asscicated,然后双击Associated Domains。然后就能看到新增的内容了
3.添加location的权限。进入到项目根目录/ios/Profile文件中,找到PERMISSION_LOCATION,取消注释,并将值改为1。没加的请看Flutter 权限申请,如何对iOS进行配置
4.在Info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription权限。
展开Runner——>展开Runner——右击Info文件——>点击openAs——>选择Source Code,然后添加如下内容
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key><string>获取用户当前连接的WiFi名称并展示在配网列表中</string><key>NSLocationWhenInUseUsageDescription</key><string>获取用户当前连接的WiFi名称并展示在配网列表中</string>
5.在代码中获取定位权限
var status = await Permission.location.status;if (!status.isGranted) {await Permission.location.request();}
6.验证是否成功
在Flutter中添加如下代码进行测试
getPhoneConnectWifiName() async { var info = NetworkInfo();String? wifiName = await info.getWifiName();print("-------------手机连接的wifi名称为:$wifiName");var status = await Permission.location.status;if (!status.isGranted) {await Permission.location.request();}wifiName = await info.getWifiName();print("-------------手机连接的wifi名称为:$wifiName");}