2016/12/02
Android で Wi-Fi Access Point との接続を切断する
> この記事は [Android の Wi-Fi 実装に関する情報のまとめ](http://kokufu.blogspot.jp/2016/10/android-wi-fi_19.html) の一部として書かれました ### 接続切断の方法は2種類ある Wi-Fi Access Point との接続を切断するには `WifiManager.disconnect()` もしくは `WifiManager.disableNetwork()` を使用します。 `WifiManager.disconnect()` を使用した場合、状態は "Saved" `WifiManager.disableNetwork()` を使用した場合、状態は "Disabled" になります。 "Disabled" といっても、登録してあるパスワード等が消えてしまったわけではありません。 設定画面から "Connect" をクリックしたり、 `WifiManager.enableNetwork()` を使用することでパスワード入力無しに再接続することが可能です。 ### 違いはあるようで無い では何が違うのかというと、**自動で** 再接続するかどうかのようです。 "Saved" の場合、何らかのタイミングで OS が再接続を試みる可能性がありますが、"Disabled" の場合はユーザー が意思を持って接続しない限り再接続されません。 ただし、後述のようにデバイスを再起動した場合は "Disabled" でも再接続されるので、完全に無効化するわけではないようです。 > 参考 > > [Android - What´s the difference between WifiManager disableNetwork() and disconnect() - Stack Overflow](http://stackoverflow.com/questions/30094055/android-what%C2%B4s-the-difference-between-wifimanager-disablenetwork-and-disconn) また、"Saved" もどのタイミングで再接続されるのかは不定のようです。 上記のサイトでは `WifiManager.disconnect()` を呼んでから数秒後に再接続されたとありますが、 私の Nexus 7 (2012) では 一度 "Saved" 状態になると自動で再接続はされませんでした 。 ただし、デバイスを再起動すると接続されます。これは "Disabled" でも同じ。 結局、私の Nexus 7 では、これらの違いがよくわかりませんでした。 コードで Wi-Fi の接続を制御したい場合、勝手に再接続されることはあまり想定しないと思われるので、 `WifiManager.disableNetwork()` を使っておくのが無難でしょう。 ### コード1 `WifiManager.disconnect()` を使用する方法です。 ```java // Activity 等の Context 内で WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); boolean succeeded = wm.disconnect(); ``` ### コード2 `WifiManager.disableNetwork()` を使用する方法です。 引数として Network ID が必要ですので、 `WifiManager.getConnectionInfo()` を使用して接続している Access Point の情報を取得します。 ```java // Activity 等の Context 内で WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wm.getConnectionInfo(); boolean succeeded = wm.disableNetwork(wifiInfo.getNetworkId()); ``` 未接続状態でも `wifiInfo` は `null` にならず、Network ID が `-1` のインスタンスが返ってきます。 > 参考 > > [穀風: Android で 接続している Wi-Fi Access Point の情報を取得する](https://kokufu.blogspot.jp/2016/11/android-access-point.html) ### パーミッション `WifiManager.disconnect()` や `WifiManager.disableNetwork()` を実行するには `android.permission.CHANGE_WIFI_STATE` パーミッションを AndroidManifest.xml で設定する必要があります。 ```xmlになります。``` また、 `WifiManager.getConnectionInfo()` を実行するには `android.permission.ACCESS_WIFI_STATE` パーミッションを AndroidManifest.xml で設定する必要があります。 ```xml ```
0 件のコメント:
コメントを投稿