2010-05-20 74 views
3

我試圖使用Wifimanager來計算在掃描期間找到的接入點的信號電平。WifiManager.calculateSignalLevel問題(RSSI,5)

我使用下面的方法:

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對於所有的測試案例calculateQoS(INT)。

我在這裏錯過了一些簡單的東西嗎?爲什麼SignalLevel總是1?

回答

10

似乎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

+1

謝謝你這個答案特別是對於實施的代碼。根據引用問題(它仍然是今天開放的),所有numLevels超過45的值都會導致除以零。 – Ridcully 2011-02-26 14:31:30

6

感謝這個問題,我可能會阻止問題上較低的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

這個問題僅限搭載Android 2.3,
你可以用的安卓4.2

這裏WiFiManger的最新代碼替換它是代碼:

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; 
}