Android中的wifi.getDhcpInfo()返回错误的IP网关

时间:2012-01-18 20:48:43

标签: android wifi dhcp

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

答案 0 :(得分: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信息的唯一方法是等待非空IP地址。

答案 1 :(得分:-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
    }

};
  • 我没有测试过这个解决方案,这只是一个建议,所以如果它不起作用请告诉我