2011-01-13 4 views
2

携帯電話をWi-Fiネットワークに接続する、またはWi-Fiアクセスポイントとして機能させるアンドロイドアプリを開発しています。正しいインターフェイス名を取得する必要があります。電話機がMacのWiFiネットワークに接続すると、インターフェイス名は「eth0」になり、アクセスポイントとして機能するときは「wl0.1」になります。wifiネットワークインターフェイス名

これは、すべてのインターフェイスを一覧表示するNetworkInterface.getNetworkInterfaces()を使用して検出されます。私はアクティブなWiFiのインターフェイス名のみを取得したい。これに関する助け?

答えて

2

NetworkInterfaceは、インターフェイスのハードウェア(MAC)アドレスを返すためにgetHardwareAddressです。 Wi-Fi(WifiManager.getConnectionInfoによって得られる)の現在の状態を表すWifiInfoは、getMacAddressメソッドを有する。後者を使用してWi-Fiインターエリアを見つけるだけです。

アドレスを比較するときは、はバイトの配列を返し、getMacAddressはコロンで区切られた16進値の文字列を返します。

1

私が知っている限り、Javaを使用して、Androidデバイス上でWi-Fiアダプタのインターフェース名を取得する方法は2つあります。いずれかを介してのWi-Fiのインターフェイスの:

  1. MACアドレス、WifiInfo's getMacAddress()
  2. IPアドレスを介して、WifiInfo's getIpAddress()

を通してあなたが情報のいずれか一枚を持っていたら、あなたは残りの部分を把握するためにNetworkInterfaceを使用することができます。

オプション#1は、MACアドレス経由で、最も良いオプションです。デバイスがネットワーク上にない場合でも、MACアドレスは常に利用可能です。デバイスがネットワークに接続されていない場合、インターフェイス名を取得することが実際には望ましいことがあります。 MACアドレスは決して変更されません。したがって、Wi-FiアダプタのMACアドレスを使用すると、より堅牢であることが保証されます。

ここでは、MACアドレスからWi-Fiインターフェイス名を取得する方法の例を示します。 の拡張です。Xionのオリジナルの答えです。 Get Wifi Interface name on Android

protected String wifiInterfaceName(final Context context) { 

    // Get WiFi interface's MAC address as a BigInteger. 
    WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE); 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    String wifiMacString = wifiInfo.getMacAddress(); 
    byte[] wifiMacBytes = macAddressToByteArray(wifiMacString); 
    BigInteger wifiMac = new BigInteger(wifiMacBytes); 

    String result = null; 
    try { 
     List<NetworkInterface> networkInterfaces 
       = Collections.list(NetworkInterface.getNetworkInterfaces()); 

     for (NetworkInterface currentInterface : networkInterfaces) { 

      byte[] hardwareAddress = currentInterface.getHardwareAddress(); 
      if (hardwareAddress != null) { 
       BigInteger currentMac = new BigInteger(hardwareAddress); 

       if (currentMac.equals(wifiMac)) { 
        result = currentInterface.getName(); 
        break; 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e("WifiGet", "Socket excpetion: " + ex.getMessage()); 
    } 

    return result; 
} 

protected byte[] macAddressToByteArray(String macString) { 
    String[] mac = macString.split("[:\\s-]"); 
    byte[] macAddress = new byte[6]; 
    for (int i = 0; i < mac.length; i++) { 
     macAddress[i] = Integer.decode("0x" + mac[i]).byteValue(); 
    } 

    return macAddress; 
} 

オプション#2は、IPアドレスを経由して、かなりの問題セクションで説明されています。 IPアドレスでWi-Fiインターフェイス名を取得しようとすると、注意すべき点がいくつかあります。

  • デバイスがWi-Fiネットワークに接続されている場合にのみ動作します。
  • IPアドレスが変更されるため、デバイスがIPアドレスを変更した場合に操作が失敗する可能性は非常に低くなります。
  • これは私がまだ解明しようとしているものです。しかし、さまざまなデバイスのエンディアンに問題があり、結果はWifiInfo getIpAddress()です。再び、私は確信していません。私が確かに知っているのは、私が実際のIPアドレスを取得するためにバイトオーダを逆にしなければならないということだけです。

次の例は、両方のコードセグメントは、例としてのみ提供されていることを覚えておいてくださいGet Wifi Interface name on Android

protected String wifiInterfaceName2(final Context context) { 

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

    // Convert little-endian to big-endianif needed 
    if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) { 
     ipAddress = Integer.reverseBytes(ipAddress); 
    } 

    byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray(); 

    String result; 
    try { 
     InetAddress addr = InetAddress.getByAddress(bytes); 
     NetworkInterface netInterface = NetworkInterface.getByInetAddress(addr); 
     result = netInterface.getName(); 
    } catch (UnknownHostException ex) { 
     LOG.error("Unknown host.", ex); 
     result = null; 
    } catch (SocketException ex) { 
     LOG.error("Socket exception.", ex); 
     result = null; 
    } 

    return result; 
} 

の質問部分に基づいています。コードをクリーンアップし、エラー処理を追加し、本番環境での使用を計画しているかどうかテストしてください。

ああ、あなたのAndroidManifest.xmlにも適切な権限を追加することを忘れないでください。私はそれらが次の行に沿ったものだと考えます。

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

また、これらの例は実際のデバイスでのみ動作します。エミュレータにはWi-Fiはありません。

関連する問題