2016/12/03

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


> この記事は [Android の Wi-Fi 実装に関する情報のまとめ](http://kokufu.blogspot.jp/2016/10/android-wi-fi_19.html) の一部として書かれました

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

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

> 参考
>
> [穀風: Android で Wi-Fi 機能の有効・無効の変化をイベントとして取得する](http://kokufu.blogspot.jp/2016/10/android-wi-fi_20.html)

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

```java
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 の接続状態を確認する](http://kokufu.blogspot.jp/2016/10/android-wi-fi-access-point_27.html)


### 登録方法1
AndroidManifest.xml に登録する方法

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

```xml

    
        
    

```

### 登録方法2
コードで登録する方法

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

```java
    // 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 件のコメント: