You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:12:03