Flutter Android端WiFi直连打印机:应用连接后无法访问设备
解决Android 13+下WifiForIoTPlugin连接WiFi-Direct打印机无网络参数问题
1. 补全Android 13+专属权限
Android 13(API 33)起,连接WiFi设备必须新增NEARBY_WIFI_DEVICES权限,若无需通过WiFi获取定位,需添加权限标记规避定位权限依赖:
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 仅Android 12及以下版本需要定位权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="32" />
如果应用需要扫描WiFi列表(而非仅连接已知SSID),则不能添加neverForLocation标记,且需主动申请ACCESS_FINE_LOCATION权限。
2. 优化连接逻辑并等待IP分配
WifiForIoTPlugin的connect返回成功仅代表WiFi关联完成,系统分配IP需要时间,需监听连接状态变化后再获取网络参数:
Future<bool> connectToNetwork(String ssid) async { // 确保WiFi功能已开启 await WiFiForIoTPlugin.setEnabled(true); final connectSuccess = await WiFiForIoTPlugin.connect( ssid, password: kNetworkPass, security: NetworkSecurity.WPA, withInternet: false, forceWifiUsage: true, // 强制路由流量到WiFi ); if (connectSuccess) { // 监听WiFi连接状态,等待IP分配完成 WiFiForIoTPlugin.onWifiConnectionChanged().listen((status) { if (status.isConnected) { _fetchNetworkParams(); _bindAppToWifi(); // 绑定应用到该WiFi网络 } }); } return connectSuccess; } Future<void> _fetchNetworkParams() async { final ip = await WiFiForIoTPlugin.getIP(); final gateway = await WiFiForIoTPlugin.getGatewayIP(); print("已获取WiFi参数: IP=$ip, 网关=$gateway"); }
3. 绑定应用到目标WiFi网络(核心步骤)
Android 10+支持多网络并发,系统可能默认优先使用蜂窝网络,需将应用进程绑定到连接的WiFi网络,确保流量走该WiFi:
import 'package:connectivity_plus/connectivity_plus.dart'; Future<void> _bindAppToWifi() async { final connResult = await Connectivity().checkConnectivity(); if (connResult == ConnectivityResult.wifi) { final wifiNetworks = await Connectivity().getWifiNetwork(); if (wifiNetworks?.isNotEmpty == true) { await Connectivity().bindProcessToNetwork(wifiNetworks.first); } } }
4. 验证效果
完成配置后,连接WiFi-Direct打印机网络后等待1-2秒,待IP分配完成后再调用打印插件,即可实现与系统对话框连接一致的打印效果。
内容的提问来源于stack exchange,提问作者derZorn
相关产品推荐
相关产品推荐

