2012-03-05 15 views
16

タイトルが言うように...私はホットスポットとして設定されている場合、WiFi ifaceのIPを取得できるようにしようとしています。理想的には、すべての電話機で機能するものを探したいと思っています。AndroidでWi-FiホットスポットのIPを取得するにはどうすればよいですか?

もちろん、WifiManagerはAPから情報を取得する場合には役に立たない。

幸いにも、私はこれを行うことによって、すべてのインターフェイスのIPアドレスを取得することができました:

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()) { 
        Log.d("IPs", inetAddress.getHostAddress()); 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(LOG_TAG, ex.toString()); 
    } 
    return null; 
} 

このコードの塊は、すべてのインターフェイス(WiFiホットスポットを含む)のすべてのIPを印刷します。主な問題は、WiFiインタフェースを識別する方法が見つからないことです。いくつかの電話機には複数のインタフェース(WiMaxなど)があるため、これは問題です。

  • フィルタリングを無線LANのiface表示名によって:これは私がこれまで試したものです、それは良い方法ではありませんので、別のデバイスからの表示名の変更(wlan0、eth0を、wl0.1、など) 。
  • MACアドレスによるフィルタリング:ほとんどの場合動作しますが、一部のデバイスではホットスポットifaceにはMACアドレスがありません(iface.getHardwareAddress()がnullを返す)...有効な解決策ではありません。

答えて

0

対応可能なNetworkInterfaceを見つけるためにWiFiManagerConnectionInfoを利用するsolutionがあります。

あなただけの、あなたが使用できるIPが必要な場合:

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 
WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
int ipAddress = wifiInfo.getIpAddress(); 
+3

申し訳ありませんが、解決策ではありません。私が前に言ったように、ifaceがAPモードにあるとき、WifiManagerは役に立たない。 AndroidはWi-Fiが無効になっていると「考える」。 一方、提供するソリューションに似たものを試しましたが、IPの代わりにMACアドレスを使用しました。しかし私がすでに指摘したように、それはうまくいかない。何らかの理由で、Wi-Fi ifaceのMACアドレスがヌルです(一部のデバイスでは)。 – sirlion

+0

@sirlionはマニフェストのACCESS_WIFI_STATEですか? – tenorsax

+2

うん、そうです。私を信じて、そのアプローチはうまくいかない。/ – sirlion

0

無線LANホットスポットとして設定されていない場合は、ホットスポットは、名前が消えていることを、オンされたとき、それは名前android-xx7632x324x32423家 を持っています。また、IPアドレスも変わります。

ホットスポットを有効にする前にWifi設定を取得できる場合は、先にintf.getName()を使用して参照を取得できます。

第2に、ipが変更されました。したがって、どのインタフェースがCONNECTEDモードにあるか知っていれば、その情報を使用して後でホットスポットを有効にした後で識別することができます。

以下は、私がデバッグに使用したコードです。私は私が見つけることができるすべてを吐き出す、私は私の問題を考え出したときにそれをきれいにする巨大な混乱を作る。 GL

import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.util.Collections; 
import android.net.ConnectivityManager; 

textStatus = (TextView) findViewById(R.id.textStatus); 

try { 
    for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) { 
    for (InetAddress addr : Collections.list(intf.getInetAddresses())) { 
     if (!addr.isLoopbackAddress()){ 
     textStatus.append("\n\n IP Address: " + addr.getHostAddress()); 
     textStatus.append("\n" + addr.getHostName()); 
     textStatus.append("\n" + addr.getCanonicalHostName()); 
     textStatus.append("\n\n" + intf.toString()); 
     textStatus.append("\n\n" + intf.getName()); 
     textStatus.append("\n\n" + intf.isUp()); 
     } 
    } 
    } 
} catch (Exception ex) { 
    textStatus.append("\n\n Error getting IP address: " + ex.getLocalizedMessage()); 
} 


connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
allInfo = connectivity.getAllNetworkInfo(); 
mobileInfo = connectivity.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

textStatus.append("\n\n TypeName: " + mobileInfo.getTypeName()); 
textStatus.append("\n State: " + mobileInfo.getState()); 
textStatus.append("\n Subtype: " + mobileInfo.getSubtype()); 
textStatus.append("\n SubtypeName: " + mobileInfo.getSubtypeName()); 
textStatus.append("\n Type: " + mobileInfo.getType()); 
textStatus.append("\n ConnectedOrConnecting: " + mobileInfo.isConnectedOrConnecting()); 
textStatus.append("\n DetailedState: " + mobileInfo.getDetailedState()); 
textStatus.append("\n ExtraInfo: " + mobileInfo.getExtraInfo()); 
textStatus.append("\n Reason: " + mobileInfo.getReason()); 
textStatus.append("\n Failover: " + mobileInfo.isFailover()); 
textStatus.append("\n Roaming: " + mobileInfo.isRoaming()); 

textStatus.append("\n\n 0: " + allInfo[0].toString()); 
textStatus.append("\n\n 1: " + allInfo[1].toString()); 
textStatus.append("\n\n 2: " + allInfo[2].toString()); 
9

は、ここで私はWiFiホットスポットのIPを取得するためにやったことだ:

public String getWifiApIpAddress() { 
    try { 
     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)) { 
         Log.d(TAG, inetAddress.getHostAddress()); 
         return inetAddress.getHostAddress(); 
        } 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e(TAG, ex.toString()); 
    } 
    return null; 
} 

これはのIPアドレスにあなたにそれがホットスポットのためだけではありません意味任意の無線LANデバイスを提供します。別の無線LANネットワークに接続している場合(つまり、ホットスポットモードでない場合)、IPが返されます。

最初にAPモードになっているかどうかを確認する必要があります。このクラスを使用することができます:http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

+0

こんにちは@ajma、この貴重なコードを共有してくれてありがとうございます仕事と私に両方の "WiFiシンプルなルータのネットワーク"& "WiFiテザリングまたはホットスポット"のIPアドレスを与える。 –

+2

これは100%正確ではありません。私は、ネットワークインタフェース名が大きく異なることを知りました。 HTC Desire Z:wl0.1; Prestigio 3540:ap0; Nexus 5/Samsung DUOS:wlan0。一方、すべてのケースでは、リストされたデバイスは1つだけです(ループバックなどはありません)。 –

+0

このコードは、インターフェイスの名前がap0の一部のデバイスでは機能しません。私は次の修正を提案します:if((intf.getName()。contains( "wlan"))||(intf.getName()。contains( "ap"))){ ipアドレスがap0にあるため、inetアドレスはありません。私も私の場合はループバックインターフェイスを持っています。それがwifiルータに接続されている場合、wlan0を使用します。 – Gaucho

2

これを使用できます。テストされていませんが、うまくいくはずです。

((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo().serverAddress 
0
private static byte[] convert2Bytes(int hostAddress) { 
    byte[] addressBytes = { (byte)(0xff & hostAddress), 
      (byte)(0xff & (hostAddress >> 8)), 
      (byte)(0xff & (hostAddress >> 16)), 
      (byte)(0xff & (hostAddress >> 24)) }; 
    return addressBytes; 
} 

public static String getApIpAddr(Context context) { 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); 
    byte[] ipAddress = convert2Bytes(dhcpInfo.serverAddress); 
    try { 
     String apIpAddr = InetAddress.getByAddress(ipAddress).getHostAddress(); 
     return apIpAddr; 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+1

は、コードの説明を追加するのに最適です – Yurets

0

私はintf.getName().contains("wl") || intf.getName().contains("ap")intf.getName().contains("wlan")を変え、ajmaのソリューションを使用しています。そしてそれは多くの携帯電話のために働く。

の場合、WiFiに接続した場合は、になります。

関連する問題