Когда пользователь подключен к сети Wi-Fi, мне нужно убедиться, что пароль, который пользователь вводит в мое приложение, является правильным. С целью проверки того, что пользователю известен пароль сети, к которой он подключен в данный момент.
Проблема, с которой я сталкиваюсь при попытке подключиться к сети, заключается в том, что wifiManager.addNetwork(conf)
всегда возвращает -1 (даже если вы впервые отключаетесь от сети), поскольку сеть уже существует в системе. Поэтому при попытке подключения код ведет себя так же, если введенный пользователем пароль правильный или неправильный.
Идеальным решением является удаление конфигурации сети перед подключением, но это невозможно сделать с Android 6.0.
Это код, который я использовал для проверки:
public void connectFailPassword()
{
connect("AAAAAAAA", "fail password");
}
public void connectOkPassword()
{
connect("12345678", "OK password");
}
private void connect(String password, String from) {
String networkSSID = "MY SSID TO TEST HERE";
WifiConfiguration conf = new WifiConfiguration();
conf.SSID = "\"" + networkSSID + "\"";
conf.preSharedKey = "\"" + password + "\"";
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int netId = wifiManager.addNetwork(conf);
Log.i("TAG", from + " WifiConnector.connect.id " + netId);
registerWiFiEventsReceiver();
//wifiManager.disconnect();
Boolean enabled = wifiManager.enableNetwork(netId, true);
Log.i("TAG", from + " WifiConnector.enabled " + enabled);
//wifiManager.reconnect();
}
private void registerWiFiEventsReceiver() {
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
mFilter.addAction( WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
((Activity) context).registerReceiver(receiver, mFilter);
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.i("TAG", "WifiConnector.receiver: " + getCurrentNetId() + " intent: " + intent.getExtras().toString());
}
};
Подключиться с помощью пароля:
I/TAG: OK password WifiConnector.connect.id -1
I/TAG: OK password WifiConnector.enabled false
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=368]
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=1432]
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=92]
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=128]
Подключение с неверным паролем:
I/TAG: fail password WifiConnector.connect.id -1
I/TAG: fail password WifiConnector.enabled false
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=368]
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=1432]
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=92]
I/TAG: WifiConnector.receiver: 88 intent: Bundle[mParcelledData.dataSize=128]
Я знаю, что это можно сделать, потому что приложение InstantBridge делает именно это, когда вы добавляете точку доступа Wi-Fi на всех устройствах, даже выше, чем 6.0.