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

Android非活跃网络连接问题:Delphi(FMX)+Indy10连接无网WIFI异常

我处理过不少Delphi FMX在Android上的网络适配问题,尤其是这种需要连接无互联网WiFi内网数据库的场景,结合Indy10的特性,给你几个实用的解决方案:

方案1:强制Indy绑定WiFi接口通信

Android的ConnectionManager会因为WiFi无互联网访问而误标记为“未连接”,但实际上WiFi链路本身是通的。我们可以让Indy直接指定使用WiFi网络接口发送数据,绕过系统默认路由的干扰:

  • 先通过TIdStack获取设备上的所有网络接口,筛选出WiFi对应的接口(通常名称包含wlan,或者接口类型为iftWiFi);
  • 给Indy客户端组件(比如TIdTCPClient)的Binding属性指定该WiFi接口的IP地址,强制走WiFi链路通信。示例代码如下:
var
  Stack: TIdStack;
  I: Integer;
  WiFiIP: string;
begin
  Stack := TIdStackStack.Create;
  try
    for I := 0 to Stack.GetInterfaceCount - 1 do
    begin
      // 根据设备实际情况调整WiFi接口的判断条件
      if Pos('wlan', LowerCase(Stack.GetInterfaceName(I))) > 0 then
      begin
        WiFiIP := Stack.GetInterfaceIP(I);
        Break;
      end;
    end;
    if WiFiIP <> '' then
    begin
      IdTCPClient1.Binding.Bind(WiFiIP, 0); // 绑定WiFi接口的IP
      IdTCPClient1.Connect;
    end;
  finally
    Stack.Free;
  end;
end;
方案2:调整Android网络偏好,阻止自动切换网络

Android默认会在当前网络无互联网时自动切换到移动数据,你可以通过代码或引导用户手动设置来禁用这个行为:

  • 代码层面:借助Android原生的ConnectivityManager和NetworkRequest创建仅针对WiFi的网络请求,设置NETWORK_SCORE_DISABLE来阻止系统切换网络。这需要申请ACCESS_NETWORK_STATE、CHANGE_NETWORK_STATE权限,部分高版本Android可能需要用户授权或系统级权限;
  • 手动设置:引导用户进入WiFi设置,长按目标WiFi网络选择「修改网络」,勾选「高级选项」,将IP设置改为「静态」,仅填写WiFi网关地址,减少系统误判的概率。
方案3:自定义内网连通性检测,忽略系统状态

不要依赖Android ConnectionManager的网络状态返回值,自己实现内网连通性检测:

  • 用Indy的TIdICMPClient定期ping数据库服务器的内网IP,只要能ping通,就判定WiFi可用;
  • 即使系统报告WiFi未连接,只要内网检测通过,就保持Indy的连接并继续使用WiFi接口,不受系统状态切换的干扰。
额外注意事项
  • 确保Delphi项目已添加必要的Android权限:ACCESS_WIFI_STATE、ACCESS_NETWORK_STATE、INTERNET,修改网络状态还需CHANGE_NETWORK_STATE;
  • 合理设置Indy组件的超时参数,避免因网络波动频繁触发断开重连;
  • 尽量在真实Android设备上测试,模拟器的网络行为可能和真机存在差异。

内容的提问来源于stack exchange,提问作者Bart Kindt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:15:48