私はwifiアプリを開発しています。ユーザーが選択したスキャンしたネットワークのパスワードを入力するように求められます。ユーザーが正しいパスワードを入力すると、接続して正常に機能します。しかし、ユーザーが間違ったパスワードを入力すると、その名前で新しいネットワークが追加され、間違ったパスワードのcosの認証に失敗し、認証問題のステータスになります。
ユーザーが同じネットワークをもう一度スキャンして選択し、正しいパスワードを入力しようとすると、以前の接続ではまだ認証問題のステータスが表示されているため、パスワードが正しく、ステータスが無効になっていても、接続に失敗します。
この問題を解決するには? ConnectivityManagerまたはwifimanagerを使用してすべてのネットワークを忘れる方法はありますか?または他の解決策はありますか?
WifiManager
ソースコードには、次のメソッドがあります。
_/*
* Delete the network in the supplicant config.
*
* This function is used instead of a sequence of removeNetwork()
* and saveConfiguration().
*
* @param config the set of variables that describe the configuration,
* contained in a {@link WifiConfiguration} object.
* @hide
*/
public void forgetNetwork(int netId) {
if (netId < 0) {
return;
}
mAsyncChannel.sendMessage(CMD_FORGET_NETWORK, netId);
}
_
ただし、このメソッドは_@hide
_であるため、使用できません。しかし、このコメントによると:
この関数は、
removeNetwork()
およびsaveConfiguration()
のシーケンスの代わりに使用されます
代わりにremoveNetwork()
およびsaveConfiguration()
を使用してみてください。
はい、removeNetwork()
は機能します。これを使用してすべてのネットワークを削除しました。
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
wifiManager.removeNetwork(i.networkId);
//wifiManager.saveConfiguration();
}
wifiManager.saveConfiguration()
このメソッドはAPIレベル26で廃止されました。このメソッドを呼び出す必要はありません。addNetwork(WifiConfiguration)、updateNetwork(WifiConfiguration)、およびremoveNetwork(int)はすでに構成を自動的に永続化しています。
https://developer.Android.com/reference/Android/net/wifi/WifiManager.html#saveConfiguration()
removeNetwork()
メソッドを使用して冗長ネットワーク接続を削除し(同じnetId
になるかどうかは疑問ですが)、接続を新しく追加しますあなたが抱えている問題を回避するために。
wifiManager.saveConfiguration();
Android Mで廃止されました。removeNetwork(int)はすでに構成を自動的に永続化しているため、saveConfigurationを呼び出す必要はありません。
https://developer.Android.com/reference/Android/net/wifi/WifiManager.html#saveConfiguration()
これにより、リストに構成されているネットワークのリストを取得し、すぐに削除と保存を実行できます。
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
wifiManager.removeNetwork(i.networkId);
wifiManager.saveConfiguration();
}
特定の許可が必要です。
final int numOpenNetworksKept = Build.VERSION.SDK_INT >= 17
? Settings.Secure.getInt(resolver, Settings.Global.WIFI_NUM_OPEN_NETWORKS_KEPT, 10)
: Settings.Secure.getInt(resolver, Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT, 10);