我正在尝试使用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?
答案 0 :(得分: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;
}
}
也许这段代码可以解释您的问题。另请注意:
答案 1 :(得分: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 :(得分:2)
此问题仅适用于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;
}