2

直後にWIFI_STATE_ENABLEDがBroadcastReceiverによって受信されると、WifiInfoのSSID値はnullになります。ただし、Thread.Sleep()を800ミリ秒追加すると機能します。Wi-FiとWifiInfoオブジェクトを接続して実際に情報を取得するイベントに遅延があるようです。以下のスニペットは機能します:

    else if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
        int extraWifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
        switch (extraWifiState) {
        case WifiManager.WIFI_STATE_ENABLED:
            // The SSID is null just after connection is established. This
            // event seems over eager.
            try {
                Thread.sleep(800, 0);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (!wifiFunctions.connectedToGConnectHotspot()) {
                removeConnectedNotification();
            } else {
                settings.setLastNotificationTime(System.currentTimeMillis());
                notifyUserOfAvailableHotspot(true);
                return;
            }
            break; 

それは機能しますが、それは非常に危険です。一部のデバイスで時間がかかる場合はどうなりますか?接続されたSSIDを取得する別の方法はありますか?EXTRA_NETWORK_INFOを調べましたが、APIレベル14で非推奨になり、SSIDが含まれていないようです。人為的な待機を導入せずにSSIDを取得する別の方法はありますか?

4

2 に答える 2

2

WIFI_STATE_ENABLEDSSIDを取得しようとしている場合は、キャプチャしたいアクションではありません。あなたがもっと興味を持っているかもしれないものはNETWORK_STATE_CHANGEDです。

WIFI_STATE_ENABLEDは、電話のWiFiデバイスがオンになっているときに発生します。その時点で、必ずしもどこにも接続されているとは限りません。

編集:コメントで指摘されているように、NETWORK_STATE_CHANGEDは他の多くのイベントでもトリガーされます。WiFiアクセスポイントへの接続を厳密に監視するには、SUPPLICANT_CONNECTION_CHANGE_ACTIONがリッスンする正しいアクションです。

于 2013-01-25T08:19:13.033 に答える
1

作業中のアプリにSUPPLICANT_CONNECTION_CHANGE_ACTIONを使用していますが、Wi-Fiを有効にしてから接続するとうまく機能することがわかりました。

問題は、Wifiが有効になっているときにWifiネットワークを変更したときにトリガーされないように見えることです。この場合に発生すると思われる唯一のアクションはNETWORK_STATE_CHANGEDです(3回、最初の2回はWifiInfoがnullです)。

私は1つのデバイス(Galaxy S3 4.1)しか試したことがないので、これがどれほど普及しているかはわかりませんが、SUPPLICANT_CONNECTION_CHANGE_ACTIONがこれで機能するはずです。もう1つの注意点は、同じアクセスポイント(2.4と5.2)で2つのSSIDを切り替えているため、Androidが実際にネットワークの変更と見なしていない可能性があることです。

編集:GalaxyS3を2番目のWifiホットスポットとして使用してCyanogenMod10を実行しているタッチパッドでテストしました。Wifiが有効になっているときにSSID(およびアクセスポイント)を切り替えると、SUPPLICANT_CONNECTION_CHANGE_ACTIONはトリガーされません。このイベントは、Wifiを有効にした結果として接続が確立された場合にのみ発生するようです。これは実際にはバグのようです。古いAndroid2.2Legendが横になっているので、それも試してみます。残念ながら、これは仮想デバイスでテストできません。

于 2013-04-07T11:16:01.853 に答える