Проблема с WifiManager.calculateSignalLevel (RSSI, 5)

Я пытаюсь использовать Wifimanager для вычисления уровня сигнала точек доступа, обнаруженных во время сканирования.

Я использую следующий метод:

WifiManager.calculateSignalLevel (int, int)

Но, похоже, он всегда возвращает тот же int независимо от уровня RSSI.

Вот мой код:


public int calculateQoS(int aRSSI){ signalLevel = WifiManager.calculateSignalLevel(RSSI, 5); return signalLevel; } 

 public void testCalculateQoS(){ Log.d("signal", "signal = : " + connMonitor.calculateQoS(-44) + " " + connMonitor.calculateQoS(-80) + " " + connMonitor.calculateQoS(-120) + " " + connMonitor.calculateQoS(-20)); } 

Вывод журнала 1 для всех тестовых примеров для вычисленияQoS (int).

Я что-то пропустил здесь? Почему SignalLevel всегда 1?

Кажется, что calculateSignalLevel реализован следующим образом:

 public static int calculateSignalLevel(int rssi, int numLevels) { if (rssi <= MIN_RSSI) { return 0; } else if (rssi >= MAX_RSSI) { return numLevels - 1; } else { int partitionSize = (MAX_RSSI - MIN_RSSI) / (numLevels - 1); return (rssi - MIN_RSSI) / partitionSize; } } 

Возможно, этот фрагмент кода может объяснить вашу проблему. Также обратите внимание:

http://code.google.com/p/android/issues/detail?id=2555

Благодаря этому вопросу я мог бы предотвратить проблему с более низкими версиями API, чем тот, на который я нацелен. Поэтому я сделал это, чтобы вы могли использовать его на любой платформенной версии.

 public int getWifiSignalStrength(Context context){ int MIN_RSSI = -100; int MAX_RSSI = -55; int levels = 101; WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); int rssi = info.getRssi(); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH){ return WifiManager.calculateSignalLevel(info.getRssi(), levels); } else { // this is the code since 4.0.1 if (rssi <= MIN_RSSI) { return 0; } else if (rssi >= MAX_RSSI) { return levels - 1; } else { float inputRange = (MAX_RSSI - MIN_RSSI); float outputRange = (levels - 1); return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); } } }//end method 

Эта проблема касается только Android 2.3,
Вы можете заменить его последним кодом WiFiManger для Android 4.2.

Вот код:

 public int calculateSignalLevel(int rssi, int numLevels) { if(rssi <= MIN_RSSI) { return 0; } else if(rssi >= MAX_RSSI) { return numLevels - 1; } else { float inputRange = (MAX_RSSI - MIN_RSSI); float outputRange = (numLevels - 1); if(inputRange != 0) return (int) ((float) (rssi - MIN_RSSI) * outputRange / inputRange); } return 0; }