androidのコンピューター名やIPアドレスを取得する方法を教えてください

解決


デンカ  2020-02-01 10:51:46  No: 148519

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で取得する方法を教えてください。
よろしくお願いいたします。


take  2020-02-03 08:50:45  No: 148522

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;


デンカ  2020-02-03 13:39:01  No: 148525

takeさん、いつもいつもありがとうございます。

ターゲットプラットフォームをAndroidに指定しているのが原因だと思われますが、
WinSock系をusesに記述した時点でエラーになってしまいます。
すみません。


take  2020-02-03 14:31:00  No: 148526

エンデバカデロのフォーラムにその現象が報告されていました。

https://forums.embarcadero.com/thread.jspa?messageID=1049296

Q.このソースはAndroidでは正常に機能しません。 127.0.0ネットワークのみを取得します。
使用可能なすべてのIPv4ネットワークのリストを取得する機能を
Androidで動作させる方法はありますか?

A.私の記憶が正しければ、IndyはAndroidapiユニットを使用しません。これらはFPCと互換性がないためです
このコードを使用して、DelphiでIPv4およびIPv6アドレスを取得できます(次のインスタンスを作成する必要があります)
TIdStackLocalAddressListに渡します):

ソースはリンク先のを参照願います。


デンカ  2020-02-03 15:07:01  No: 148527

takeさん、ありがとうございます。

教えていただいたフォーラム記載のソースでIPアドレスを取得できました。
ありがとうございました。

ちなみに、モデル名は”TJBuild.JavaClass.MODEL”で取得することにしました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加