2010-05-20 41 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; 
}