【问题标题】:Issue with WifiManager.calculateSignalLevel(RSSI, 5)WifiManager.calculateSignalLevel(RSSI, 5) 的问题
【发布时间】:2011-02-21 20:11:40
【问题描述】:

我正在尝试使用 Wifimanager 计算扫描期间发现的接入点的信号级别。

我正在使用以下方法:

WifiManager.calculateSignalLevel(int, int)

但无论 RSSI 级别是什么,它似乎总是返回相同的 int。

这是我的代码:


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

        }

calculateQoS(int) 的所有测试用例的日志记录输出 1。

我在这里遗漏了一些简单的东西吗?为什么 SignalLevel 总是 1?

【问题讨论】:

    标签: android rssi wifimanager


    【解决方案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;
      }
    }
    

    也许这段代码 sn-p 可以解释你的问题。另请注意:

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

    【讨论】:

    • 感谢您的回答,尤其是实现代码。根据参考问题(今天仍然开放),所有超过 45 的 numLevels 值都会导致除以零。
    【解决方案2】:

    感谢这个问题,我可以防止在较低 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
    

    【讨论】:

      【解决方案3】:

      此问题仅在 android 2.3 中,
      您可以将其替换为 android 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多