5

我正在编写一个需要根据用户选择连接到不同 Wifi 网络的 Android 应用程序。我需要从 networkInfo 中检索网关 IP 地址。我面临的问题是,如果我连接到 wifi 网络配置 A,然后想切换到网络配置 B,wifi.getDhcpInfo(); 返回网络 A 的网关 IP 地址。通过用户界面工作流程多次尝试后,最终返回网络 B 的网关 IP。代码片段如下。如何确定新启用的网络何时返回准确的 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);
}
4

2 回答 2

2

我有完全相同的问题,并且能够通过解决方法解决它。只需要通过检查 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 地址。

于 2012-12-06T15:46:35.373 回答
-1

尝试在监听 WIFI_STATE_CHANGED 事件时捕捉 WifiManager.WIFI_STATE_ENABLED - 此状态将在所有连接过程完成后出现,因此在此阶段应正确设置网关 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
    }

};
  • 我还没有测试过这个解决方案,这只是一个建议,所以如果它不起作用,请告诉我
于 2012-06-08T16:29:16.030 回答