2012-01-18 2 views
4

사용자의 선택에 따라 다른 Wi-Fi 네트워크에 연결해야하는 Android 애플리케이션을 작성 중입니다. networkInfo에서 게이트웨이 IP 주소를 검색해야합니다. 내가 직면하고있는 문제는 Wi-Fi 네트워크 구성 A에 연결되어 있고 네트워크 구성 B로 전환하려는 경우 wifi.getDhcpInfo(); 네트워크 A의 게이트웨이 IP 주소로 돌아갑니다. 사용자 인터페이스 워크 플로를 통해 여러 번 시도한 후에 결국 네트워크 B의 게이트웨이 IP를 반환합니다. 코드 스 니펫은 아래에 있습니다. 어떤 아이디어를 어떻게 새로 결정한 네트워크가 정확한 DHCP 정보를 반환 할 것인지 결정하여 안정적으로 얻을 수 있습니다. 예를 들어 잡을 수있는 ansynchronous 이벤트가 있습니까? 감사합니다. WIFI_STATE_CHANGED을 들으면서Android의 wifi.getDhcpInfo()가 잘못된 IP 게이트웨이를 반환합니다.

WifiConfiguration config = wifiConfiguredNetworks.get(SSID); 
enableNetworkResult = false; 
enableNetworkResult = wifi.enableNetwork(config.networkId,true); 
if (enableNetworkResult == true) { 
    this.networkInfo = wifi.getDhcpInfo(); // does not return proper IP info  
    this.DeviceIP = android.text.format.Formatter.formatIpAddress(networkInfo.gateway); 
} 

답변

-1

봅니다 WifiManager.WIFI_STATE_ENABLED 잡기 위해 이벤트 -이 상태는 모든 연결 절차 완료 후, 그래서 게이트웨이의 IP가이 단계에서 적절하게 설정해야합니다 올 것이다. onPause

this.unregisterReceiver(networkStateListener); 

에이 수신기 자체

BroadcastReceiver networkStateListener = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(BroadcastReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
     int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,-1); 
     isNetworkAvailable =state == WifiManager.WIFI_STATE_ENABLED; 
     // here you can get gateway address 
    } 

}; 
  • 나는 이것을 테스트하지 않았습니다입니다 -

    IntentFilter filter = new IntentFilter(); 
    filter.addAction("android.net.wifi.WIFI_STATE_CHANGED"); 
    this.registerReceiver(networkStateListener, filter); 
    

    이 :

    이 당신의 onResume 기능으로 이동한다 해결책, 그것은 단지 술이다. gestion 때문에 작동하지 않는다면 알려주세요.

+0

작동하지 않습니다. 와이파이에서 다른 와이파이로 전환 할 때, 요청자 상태가 '완료'로 변경되기 전에도 'WIFI_STATE_ENABLED'가 수신됩니다. 그리고 그 후에도'getDhcpInfo()'는 여전히 연결이 끊어진 무선 랜의 값을 반환합니다. 몇 초 후에 만 ​​적절한 값을 반환합니다. – Paramaeleon

1

정확하게 동일한 문제가 있으며 해결 방법으로 문제를 해결할 수 있습니다. 그냥 wifiManager.getConnectionInfo을 확인하여 작업자 스레드를 만들어야합니다() getIpAddress() ==이 같은 0 뭔가를 :.

final Handler h = new Handler(); 
final WifiManager wifiManager = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE); 
new Thread(new Runnable() { 
    @Override 
    public void run() { 
     while (wifiManager.getConnectionInfo().getIpAddress() == 0) { 
      Log.d(TAG, "waiting for valid ip"); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     h.post(new Runnable() { 
      @Override 
      public void run() { 
       // proceed here 
      } 
     }); 
    } 
}).start(); 

가 나는 또한 가능한 모든 청취자를 시도, 수신기 등 아무것도 도움이되지 않습니다. 유효한 dhcp 정보를 얻는 유일한 방법은 null IP 주소를 기다리는 것입니다.

+0

몇 가지 관련 접근법을 시도했지만 (여분의 스레드가없는 경우),이 방법은 IP 주소가 미리 구성되어 있지 않은 경우에만 작동합니다. 네트워크를 전환하면 wifi 관리자는 이전 네트워크의 오래된 DHCP 구성을 오랫동안보고 한 다음 suddanly가 새 네트워크를보고합니다. – Paramaeleon

관련 문제