wifi.getDhcpInfo () в Android возвращает неверный IP-шлюз - PullRequest
4 голосов
/ 19 января 2012

Я пишу приложение для Android, которое должно подключаться к различным сетям Wifi в зависимости от выбора пользователя.Мне нужно получить IP-адрес шлюза из networkInfo.Проблема, с которой я сталкиваюсь, заключается в том, что, если я подключен к конфигурации сети Wi-Fi A, а затем хочу переключиться на конфигурацию сети B, wifi.getDhcpInfo ();возвращает к IP-адресу шлюза сети A. После нескольких попыток выполнения рабочего процесса интерфейса пользователя в конечном итоге возвращается IP-адрес шлюза сети B. Фрагмент кода приведен ниже.Любые идеи, как определить, когда вновь включенная сеть выдаст точную информацию Dhcp, чтобы я мог получить ее надежно.Есть ли асинхронное событие, которое я могу поймать, например, и т. Д. Спасибо.

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);
}

Ответы [ 2 ]

1 голос
/ 06 декабря 2012

У меня точно такая же проблема, и я могу ее исправить с помощью обходного пути.Просто нужно создать рабочий поток с проверкой 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 - дождаться ненулевого IP-адреса.

0 голосов
/ 08 июня 2012

Попытайтесь перехватить WifiManager.WIFI_STATE_ENABLED во время прослушивания события WIFI_STATE_CHANGED - это состояние наступит после завершения всех процедур подключения, поэтому на этом этапе должен быть правильно установлен шлюз ip.

это должно перейти к вашему onResume функция:

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

это - до 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
    }

};
  • Я не проверял эторешение, это всего лишь предложение, поэтому, если оно не работает, дайте мне знать, пожалуйста
...