2016/12/03

Android で Wi-Fi Access Point との接続状態変化をイベントとして取得する

この記事は Android の Wi-Fi 実装に関する情報のまとめ の一部として書かれました

Wi-Fi の接続状態をイベントとして取得するには "android.net.wifi.STATE_CHANGE" action を監視する BroadcastReceiver を使います。

"android.net.wifi.WIFI_STATE_CHANGED" という action もありますが、こちらは、Wi-Fi 機能の状態変化を見るものです。 非常に紛らわしいので注意が必要です。

参考

穀風: Android で Wi-Fi 機能の有効・無効の変化をイベントとして取得する

BroadcastReceiver のコード

NetworkInfo が Extra として渡されるので、接続状態を確認することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class WifiConnectionWatcher extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { // "android.net.wifi.STATE_CHANGE"
            NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            switch (info.getState()) {
                case DISCONNECTED:
                    break;
                case SUSPENDED:
                    break;
                case CONNECTING:
                    break;
                case CONNECTED:
                    break;
                case DISCONNECTING:
                    break;
                case UNKNOWN:
                    Log.e(TAG, "Wifi connection state is UNKNOWN");
                    break;
                default:
                    Log.e(TAG, "Wifi connection state is OTHER");
                    break;
            }
        }
    }
}

参考

穀風: Android で Wi-Fi の接続状態を確認する

登録方法1

AndroidManifest.xml に登録する方法

常に変化を監視したい場合は、以下のように BroadcastReceiver を AndroidManifest.xml に追記します。

1
2
3
4
5
<receiver android:name=".WifiConnectionWatcher">
    <intent-filter>
        <action android:name="android.net.wifi.STATE_CHANGED" />
    </intent-filter>
</receiver>

登録方法2

コードで登録する方法

特定の Activity が起動している間だけ監視したい場合などは、以下のように動的に登録します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Activity 等の Context の中で
WifiConnectionWatcher mWifiConnectionWatcher = new WifiConnectionWatcher();
 
@Override
protected void onResume() {
    super.onResume();
 
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); // "android.net.wifi.STATE_CHANGE"
 
    registerReceiver(mWifiConnectionWatcher, intentFilter);
}
 
@Override
protected void onPause() {
    super.onPause();
 
    unregisterReceiver(mWifiConnectionWatcher);
}

パーミッション

このコードを実行するのに特別なパーミッションは必要ありません。

0 件のコメント: