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 情報を取得する唯一の方法は、null でない 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 に答える