2016/11/26

Android で登録済みの Wi-Fi Access Point を登録解除する

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

登録してある Wi-Fi Access Point を未登録状態に戻す方法です。

コード

WifiManager.removeNetwork() で Access Point の登録解除をすることが出来ます。 この時、Network Id が必要になるので、 WifiManager.getConfiguredNetworks() を用いて取得すると良いでしょう1

返り値は成否を表す bool 値です。 下の例では省いていますが、実際には成否判定で処理を分けた方が良いでしょう。

また、端末再起動後も設定を維持するためには WifiManager.saveConfiguration() を実行する必要があります。

2015/3/29 追記
`WifiManager.saveConfiguration()` は Android 8.0 (API 26 Oreo) で Deprecated になりました。 以後は `WifiManager.removeNetwork()` を呼ぶと自動的に保存されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Activity 等の Context の中で
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
 
List<WifiConfiguration> configurations = wm.getConfiguredNetworks();
if (configurations != null) {
    for (WifiConfiguration config : configurations) {
        if (config.SSID.equals('"' + targetSsid + '"')) { // 本当は Quote を取る方向で実装した方が良いがわかりやすさ重視で
            // 本来は返り値を判定した方が良い
            wm.removeNetwork(config.networkId);
            break;
        }
    }
}
 
// 以下を実行すると再起動後も設定が維持される(API 26 Oreo より前のみ必要)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    //noinspection deprecation
    wm.saveConfiguration();
}

パーミッション

WifiManager.removeNetwork() を実行するには android.permission.CHANGE_WIFI_STATE パーミッションを AndroidManifest.xml で設定する必要があります。

1
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

また、WifiManager.getConfiguredNetworks() を実行するには android.permission.ACCESS_WIFI_STATE パーミッションを AndroidManifest.xml で設定する必要があります。

1
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Android 6.0 以降は自分の追加した network しか登録解除できないので注意

2017/2/21 追記

Android 6.0 (API 23 Marshmallow) の変更で、自分の追加した Wi-Fi Network 以外は変更・解除ができなくなりました。

それ以外を登録解除しようとすると WifiManager.removeNetwork() を実行しても false が返り、ログには以下のように表示されてしまいます2

W/WifiStateMachine: Not authorized to remove network  cnid=0 uid=10099

参考

  1. 取得方法は他にもありますが、最も単純なものを選びました 
  2. cnid は network id, uid はアプリの user id です 
?

0 件のコメント: