2015年8月12日水曜日

Androidアプリにて自身のIPアドレスを取得

Android アプリを作っていて、環境による接続不良の原因を簡単に調べたいと思いアプリに自身のIP表示機能を実装しようと思いました。

自身のIP取得方法をGoogle先生に聞いてみるとあれこれ出てくるのですがどうもうまく動きません。

調べてみると InetAddressUtils.isIPv4Address() が "192.168.0.100" に対して false を返してくる…

これじゃァ駄目だ…

他の方法もいくつかあったのですがなんか書かれていることと結果が微妙に違っていたりするので適当に自分で作ってみました。

public String getLocalIpAddress() {
    String ip = null;
    try {
        // インターフェースを列挙
        Enumeration<networkinterface> en = NetworkInterface.getNetworkInterfaces();
        while ( (ip == null) && en.hasMoreElements() ) {
            // インターフェースオブジェクトを取得
            NetworkInterface ni = en.nextElement();

            // このインターフェースのアドレスを列挙
            Enumeration<inetaddress> ei = ni.getInetAddresses();
            while (ei.hasMoreElements()) {
                // アドレスを取得
                InetAddress ia = ei.nextElement();

                // IPv4でなければ無視
                if ( !(ia instanceof java.net.Inet4Address) ) {
                    continue;
                }
                // ループバックアドレスは無視
                if ( ia.isLoopbackAddress() ) {
                    continue;
                }

                // IPアドレスを取得
                ip = ia.getHostAddress();
                break;
            }
        }
    } catch (Exception ex) {
        Log.e("getLocalIpAddress: ", ex.toString());
    }

    return ip;
}

取得したInetAddress オブジェクトのクラスをチェックするというヤクザな方法なので、あまり参考にはならないかもしれません^^;