web-dev-qa-db-ja.com

AndroidホットスポットをホストしているときにデバイスのIPアドレスを見つける

ホットスポットをホストしているときに、デバイスのIPアドレスを見つける必要があります。私はこれまでこのコードを使用しました:

//if is using Hotspot
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
    NetworkInterface intf = en.nextElement();
    if (intf.getName().contains("wlan")) {
        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
            InetAddress inetAddress = enumIpAddr.nextElement();
            if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) {
                return inetAddress.getHostAddress();
            }
        }
    }
}

これは非常にうまく機能しますが、wifi NetworkInterfaceの名前はデバイスによって異なります。そのため、最初にデバイスのWi-Fi NetworkInterface名(ホットスポット用)を見つける必要があります。この名前を見つけるにはどうすればよいですか?または、デバイスのIPアドレスを見つけるためのより良いアプローチはありますか?

/// MACによる正しいIPアドレスの検索も機能していないようです

10
user2224350

最近、WifiAPのIPアドレスがAndroidでハードコードされていることがわかりました。ユーザーがこの値を手動で変更しない限り(これは非常にまれだと思います)、ハードコードされた値を使用するだけで十分です。これが最善の方法だと思います。 IPアドレスは「192.168.43.1」です: https://github.com/CyanogenMod/Android_frameworks_base/blob/cm-10.1/wifi/Java/Android/net/wifi/WifiStateMachine.java?source=c# L1299

9
user2224350

最初は、WiFiインターフェイスのMACアドレスを取得して、各インターフェイスのMACアドレスと比較しようとしました。しかし、少なくともCMを実行しているN4では、ホットスポットをオンにするとWiFiインターフェイスのMACが変化することがわかりました。

そこで、デバイスのリストを調べて、wifiインターフェイスを識別するためのコードをいくつか作成しました。このコードは私のN4で完全に機能します:

private String getWifiIp() throws SocketException {
    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
            en.hasMoreElements(); ) {
        NetworkInterface intf = en.nextElement();
        if (intf.isLoopback()) {
            continue;
        }
        if (intf.isVirtual()) {
            continue;
        }
        if (!intf.isUp()) {
            continue;
        }
        if (intf.isPointToPoint()) {
            continue;
        }
        if (intf.getHardwareAddress() == null) {
            continue;
        }
        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();
                enumIpAddr.hasMoreElements(); ) {
            InetAddress inetAddress = enumIpAddr.nextElement();
            if (inetAddress.getAddress().length == 4) {
                return inetAddress.getHostAddress();
            }
        }
    }
    return null;
}

1つのインターフェースのみがすべての条件に一致します:wlan0

考えられる他の解決策:

最も一般的なインターフェイス名をいくつか調べて、リストから見つけてみてください。new String[] { "wlan0", "eth0", ...];

11
flx

これはあなたを助けることができます。

シェルを呼び出してネットワークアダプタを要求し、この場合のように必要なものを確認するのは無線LANなので、このコードに従ってください

Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" ");

BufferedReader readCommandOutput = 
    new BufferedReader(new InputStreamReader(p.getInputStream()));

String line=null;
while((line=readCommandOutput.readLine())!=null){
    // Lines containing wlan will be returned
    // parse to get the name of that interface.
    String interface=line.split(":")[1];
    //this is the interface you need.
}

if (line==null){
    //nothing was found.
}

readCommandOutput.close();

添付メモ

This image is the output of the command on the Shell. または、PlayストアのAndroidターミナルエミュレータを使用して、このコマンドをAndroidシェルで実行することもできます。

IPアドレスを取得するため

WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE);
int address=wifi.getDhcpInfo().ipAddress;
Toast.makeText(this,intToIP(address),1).show();         


public String intToIP(int i) {
    return ((i & 0xFF) 
            + "." + ((i >> 8) & 0xFF)
            + "." + ((i >> 16) & 0xFF)
            + "." + ((i >> 24) & 0xFF));
 }
2
cafebabe1991

このソリューションは、同じデバイスでホットスポットデバイスのIPを取得したいが、接続されたデバイスで取得する方法がわからない場合に機能します(ほとんどの場合、サーバーのIPは192.168.43.1であり、ハードコーディングすることで作業を完了できます)

 public void serverip()

    {
     DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
            if (dhcpInfo==null){
                Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show();
            }else{

                Toast.makeText(MainActivity.this, "ip of server "+Android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show();
    }


            }
1
Priyank Patel

一度このコードを試してください:

public String getLocalIpAddress() {
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {

                        String ip = Formatter.formatIpAddress(inetAddress.hashCode());
                        Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show();

                        return ip;
                    }
                }
            }
        } catch (SocketException ex) {
            Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show();

        }
        return null;
    }

Oncreatでコードを記述して、ホットスポットが有効になっていないことを確認します。

WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 
        wifiManager.setWifiEnabled(true);
        wifiManager.setWifiEnabled(false);
        boolean wifiEnabled = wifiManager.isWifiEnabled();
        if (wifiEnabled) {
            Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show();
            getLocalIpAddress();
        }else {
                Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show();
        }
0
R KiranKumar

intf.getName()intf.getDisplayName()に置き換えてから試してください。

0
Mobility

user2224350は次のように述べています。「最近、WifiAPのIPアドレスがAndroidでハードコードされていることがわかりました。」

ユーザーがこの値を手動で変更しない限り(これは非常にまれだと思います)、ハードコードされた値を使用するだけで十分です。これが最善の方法だと思います。 IPアドレスは「192.168.43.1」です ここに表示されているように

これは私のSamsungA3とHuaweiPRA-LX1で機能しますが、HTC Desires530は192.168.1.1も返します。

0
yrt