Delphi10.3CEのIndy10で、androidのコンピューター名やIPアドレスを取得する方法を教えてください。
具体的には、androidの設定->システム->端末情報の機種名(モデル番号?)やIPアドレスを取得したい。
https://stackoverflow.com/questions/576538/delphi-how-to-get-all-local-ips
や
https://www.indyproject.org/2014/03/14/tidstack-addlocaladdressestolist-method-is-now-deprecated/
を参考に作ってみました。
uses IdGlobalProtocols
HostName := IndyComputerName;
------------------------------------
uses IdStack
LList: TIdStackLocalAddressList;
LAddr: TIdStackLocalAddress;
I: Integer;
begin
LList := TIdStackLocalAddressList.Create;
try
GStack.GetLocalAddressList(LList);
for I := 0 to LList.Count-1 do
begin
LAddr := LList[I];
case LAddr.IPVersion of
Id_IPv4: begin
Memo1.Lines.Add('IP(v4):'+LAddr.IPAddress);
end;
Id_IPv6: begin
Memo1.Lines.Add('IP(v6):'+LAddr.IPAddress);
end;
end;
end;
finally
LList.Free;
end;
Windows10の環境では、NICの複数刺しや複数のIPアドレスを設定していても、問題なく取得できたのですが、
Android9では、HostNameには「localhost」、IPアドレスには「127.0.0.1」になってしまいました。
Androidで取得する方法を教えてください。
よろしくお願いいたします。
Windows10までしか試していないのIPv4のみで複数のIPには対応していませんが
こちらではこのように取得しています。
function GetMachineNetworkIP: string;
var
wsaData : TWsaData;
hostName : array [0..255] of char;
host : PHostEnt;
in_addr : TInAddr;
begin
WSAStartup($101, wsaData);
WinSock.gethostname(hostName,sizeof(hostName));
host := gethostbyname(hostName);
in_addr :=PInAddr(PInAddr(host^.h_addr_list)^)^;
result :=string(inet_ntoa(in_addr));
WSACleanup;
end;
takeさん、いつもいつもありがとうございます。
ターゲットプラットフォームをAndroidに指定しているのが原因だと思われますが、
WinSock系をusesに記述した時点でエラーになってしまいます。
すみません。
エンデバカデロのフォーラムにその現象が報告されていました。
https://forums.embarcadero.com/thread.jspa?messageID=1049296
Q.このソースはAndroidでは正常に機能しません。 127.0.0ネットワークのみを取得します。
使用可能なすべてのIPv4ネットワークのリストを取得する機能を
Androidで動作させる方法はありますか?
A.私の記憶が正しければ、IndyはAndroidapiユニットを使用しません。これらはFPCと互換性がないためです
このコードを使用して、DelphiでIPv4およびIPv6アドレスを取得できます(次のインスタンスを作成する必要があります)
TIdStackLocalAddressListに渡します):
ソースはリンク先のを参照願います。
takeさん、ありがとうございます。
教えていただいたフォーラム記載のソースでIPアドレスを取得できました。
ありがとうございました。
ちなみに、モデル名は”TJBuild.JavaClass.MODEL”で取得することにしました。