Я делаю приложение, где пользователь должен быть подключен к локальной сети Wi-Fi. Когда пользователь открывает приложение, я проверяю, подключено ли Wi-Fi, и затем, если они подключены к правильному маршрутизатору.
Я написал свое приложение таким образом, что 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? Я чувствую, что пауза в моем коде допускает поражение и, вероятно, вызывает проблемы на линии.
Кроме того, если есть лучший способ сделать все эти проверки, я открыт для предложений.
НагарджунаРедди, ваша связь привела меня на правильный путь, чтобы найти решение. Если 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.