Приложение падает при подключении к сети Wi-Fi - PullRequest
1 голос
/ 17 марта 2012

Я делаю приложение, где пользователь должен быть подключен к локальной сети Wi-Fi. Когда пользователь открывает приложение, я проверяю, подключен ли wifi, а затем подключен ли он к нужному маршрутизатору.

Я написал свое приложение так, чтобы CheckWifiConnection () вызывался после BroadcastReceivers на WIFI_STATE_CHANGED_ACTION, SCAN_RESULTS_AVAILABLE_ACTION и SUPPLICANT_CONNECTION_CHANGED_ACTION.

Мое приложение падает, когда пользователь запускает с отключенным Wi-Fi. Приходит предупреждение с просьбой включить Wi-Fi. Как только Wi-Fi включен, BroadcastReceiver вызывает CheckWifiConnection () и вылетает на info.getSSID (), говоря: error receiving broadcast intent act=android.net.wifi.wifi_state_changed

Сбой, потому что я в процессе подключения к сети Wi-Fi после включения радио. Если я просто добавлю вызов Handler.postDelayed, он будет работать.

Вот соответствующий код. Часть моего файла манифеста:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

/********************* Wifi Related Functions **********************/
private boolean CheckWifiConnection() {
    // Connect to Wifi if not enabled
    if (wifiManager.isWifiEnabled() == false) {
        Log.d(TAG,"Wifi not on");
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("This app needs Wifi On");
        builder.setMessage("Is that OK?");
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {
                wifiManager.setWifiEnabled(true);
                Log.d(TAG,"Turning WIFI on");
            }
        });
        builder.setNeutralButton("NO", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                // For the time being connect to WIFI anyway
                // Probably change to a toast and exit program
                wifiManager.setWifiEnabled(true);
            }
        });
        checkWifiStatus = true;

        builder.show();
        return false;
    }

    Log.d(TAG,"Wifi is On");

    // See if they are connected to configured router
    WifiInfo info = wifiManager.getConnectionInfo();
    Log.d(TAG,"Have Wifi Info");
    if ( info.getSSID().matches(router) == false) {
        // Do a scan to see if they can see us
        wifiManager.startScan();
        Log.d(TAG,"Starting Network Scan");
        return false;
    }

    return true;

} 


private BroadcastReceiver wifiConnectionChanged = new BroadcastReceiver() {
    public void onReceive(Context c, Intent i){
        if (checkWifiStatus && wifiManager.isWifiEnabled()) {
            Log.d(TAG,"WIFI is now on");
            checkWifiStatus = false;
            CheckWifiConnection();
        }       
    }

};

Есть ли способ проверить, подключен ли я к маршрутизатору и / или BroadcastReceiver для подключения к сети Wi-Fi? Я чувствую, что пауза в моем коде признает поражение и может вызвать проблемы в будущем.

Кроме того, если есть лучший способ выполнить все эти проверки, я открыт для предложений.

1 Ответ

0 голосов
/ 18 марта 2012

NagarjunaReddy, ваша ссылка привела меня на правильный путь, чтобы найти решение.Если антенна Wi-Fi находится в процессе подключения, то информация не является нулевой, но info.getSSID ().Таким образом, кажется, что лучше написать:

WifiInfo info = WifiManager.getConnectionInfo();
if (info.getSSID() != null) {
    String ssid = info.getSSID();
    ...
}

Я не знаю, было бы излишним писать:

if (info != null && info.getSSID() != null)

Кроме того, BroadcastReceiver, который мне нужно отслеживать, когдаустановлено соединение WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.Оказывается, у меня была ошибка копирования и вставки в моем onResume (), и я действительно не регистрировал WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.

...