Почему WifiManager.addNetwork возвращает идентификатор сети, но не подключается - PullRequest
0 голосов
/ 08 апреля 2019

Я использую WifiManager для подключения к сети или фактически к устройству. Он работал отлично, а затем внезапно остановился, без изменений кода. Я начал использовать другой телефон. Я проверил и считаю, что телефон настроен правильно. Когда я вызываю addNetwork, я получаю идентификатор сети, который отличается от текущего идентификатора сети. Когда я запускаю enableNetwork, передавая идентификатор сети, возвращенный addNetwork, я не получаю сообщение об ошибке, но при проверке информации о соединении я все еще подключен к исходной сети. Устройство, к которому я подключаюсь, не требует ввода имени пользователя или пароля. Может кто-нибудь сказать мне, что я делаю не так.

Заранее благодарю за любую помощь, которую вы можете мне оказать.

Я попытался выполнить переподключение сразу после включения сети, и я попытался отключиться от текущей сети перед подключением к новой.

import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.util.Log;

public class DeviceConnect extends AsyncTask<String, String, String> {
    public interface AsyncResponse {
        void processFinish(String output);
    }

    public AsyncResponse delegate = null;

    public DeviceConnect(AsyncResponse delegate){
        this.delegate = delegate;
    }

    private Context _context = null;
    private String _result = null;
    private WiFiHandler _wifiHandler = null;

    public void setContext(Context value) {
        this._context = value;
    }
    public String getResult() {
        return this._result;
    }

    @Override
    protected String doInBackground(String... params) {
        String message = null;
        boolean ok = true;
        String device = params[0];
        this._result = null;

        this._wifiHandler = new WiFiHandler();
        if (!device.isEmpty()) {
            int netID = 0;
            WifiManager wifi = (WifiManager) this._context.getSystemService(Context.WIFI_SERVICE);
            WifiConfiguration config;
            WifiInfo connInfo;

            config = new WifiConfiguration();
            config.SSID = device;
            wifi.disconnect();
            netID = wifi.addNetwork(config);
Log.e("doInBackground", "netID: " + netID);
            if (netID > 0) {
                try {
                    wifi.enableNetwork(netID, true);
                } catch (Exception ex) {
                    ok = false;
                    this._result = device + " - Add network failed (2)";
                }
                if(ok) {
                    connInfo = wifi.getConnectionInfo();
Log.e("doInBackground", connInfo.getSSID() + " - " + connInfo.getNetworkId());
                    if (connInfo != null && connInfo.getSSID().equalsIgnoreCase(device)) {  // || (netID = connInfo.getNetworkId()) <= 0) {
                        this._result = "SUCCESS";
                    } else {
                        this._result = device + " - Add device failed (3)";
                    }
                }
            } else {
                this._result = device + " - Add device failed (1)";
            }
        } else {
            this._result = "No device to configure";
        }

        return this._result;
    }

    @Override
    public void onPostExecute(String result) {
        delegate.processFinish(result);
    }
}

Следует подключиться к устройству и вернуть «УСПЕХ». Для того, что мне нужно сделать, я буду подключен к устройству только в течение секунды или около того.

1 Ответ

0 голосов
/ 09 апреля 2019

После нескольких часов попыток и неудач я наконец нашел ответ. Это было очевидно, проблема времени. Код ниже решил мою проблему.

            Object lock = new Object();
            lock = wifi.enableNetwork(netID, true);
            synchronized(lock) {
                lock.wait(500);
            }
...