【发布时间】:2015-06-28 15:14:07
【问题描述】:
我用Delphi XE7为Androiod设备开发的项目需要标题中声明的函数。
我找到了一段代码,它可以在 Windows 和 IOS 平台上运行并得到正确的结果。但在 Android 设备上,结果始终是:IP 地址 = 127.0.0.1,子网掩码为空。
procedure TForm1.RefreshList;
var
LList: TIdStackLocalAddressList;
I: Integer;
AAddresses: TStrings;
begin
AAddresses := TStringList.Create;
try
TIdStack.IncUsage;
try
LList := TIdStackLocalAddressList.Create;
try
// for backwards compatibility, return only IPv4 addresses
GStack.GetLocalAddressList(LList);
if LList.Count > 0 then begin
AAddresses.BeginUpdate;
try
for I := 0 to LList.Count-1 do begin
if LList[I].IPVersion = Id_IPv4 then begin
AAddresses.Add(
LList[I].IPAddress+':'+
TIdStackLocalAddressIPv4(LList[I]).SubNetMask);
end;
end;
finally
AAddresses.EndUpdate;
end;
end;
finally
LList.Free;
end;
finally
TIdStack.DecUsage;
end;
if AAddresses.Count > 0 then
Text1.Text:= AAddresses.Text;
finally
AAddresses.Free;
end;
end;
我发现byandroid.net.wifi.WifiManager.getDhcpInfo大概可以得到信息,但是我不知道怎么在Delphi中使用这个界面还是这样对吗?
【问题讨论】:
-
SubNetMask属性尚未在 Android 上实现。IPAddress是127.0.0.1因为 Indy 在 Android 上使用getaddrinfo(),将本地主机名指定为要解析的主机,显然 Android 将其解析为环回 IP。在 OSX/iOS 上,Indy 使用 POSIXgetifaddrs()函数,而在 Windows 上,它使用 Win32GetAdaptersInfo()/GetAdaptersAddresses()函数。这些 API 报告实际 IP 和子网掩码... -
... Indy 有一个 TODO 项,用于支持 Android 上的
getifaddrs()(Android 本身不支持,但有一个第三方实现浮动)或通过 Delphi 的 JNI 提供的原生 Android API桥接框架(但这并不能解决 FreePascal 的问题,因此需要getifaddrs())。 -
@Remy 我仍然有这个问题,在 Delphi 10 Seattle。无论我尝试什么,
TIdStack、TIdTCPClient.Socket.BoundIP或JNI。无论我尝试什么,我总是得到127.0.0.1。非常令人沮丧,我仍然没有找到解决方案:-/ -
@JerryDodge Indy 尚未更新以解决 Android 上的此问题。请注意,
BoundIP是仅输入属性,而不是输出属性。如果要绑定IP,连接后使用TIdTCPClient.Socket.Binding.IP。否则,使用 JNI 桥接器访问 Java API 应该能够获得正确的 IP,前提是您一开始就正确使用了 API。随意发布一个新的问题。