Проблема с WifiManager.calculateSignalLevel (RSSI, 5) - PullRequest
3 голосов
/ 20 мая 2010

Я пытаюсь использовать 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 для всех тестовых случаев для CalcuQQoS (int).

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

Ответы [ 3 ]

10 голосов
/ 17 сентября 2010

Кажется, что 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

6 голосов
/ 20 августа 2012

благодаря этому вопросу я смог предотвратить проблему с более низкими версиями 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
2 голосов
/ 03 апреля 2013

Эта проблема есть только в 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;
}
...