Android 与wifimanager.calculatesignalstrenth有关的问题

Android 与wifimanager.calculatesignalstrenth有关的问题,android,wifimanager,Android,Wifimanager,我使用以下代码计算wifi信号强度: List<ScanResult> results = wifiDemo.wifi.getScanResults(); for(int i=0;i<results.size();i++) { int signallevel=WifiManager.calculateSignalLevel(result.level,10); } List results=wifiDemo.wifi.getScanResults();

我使用以下代码计算wifi信号强度:

List<ScanResult> results = wifiDemo.wifi.getScanResults();

for(int i=0;i<results.size();i++)
{    
    int signallevel=WifiManager.calculateSignalLevel(result.level,10);    
}
List results=wifiDemo.wifi.getScanResults();

对于(int i=0;i您应该记住,
WifiManager.calculateSignalLevel(result.level,10)
将只返回0-9之间的数字。因此,它最好用于显示wifi强度指示器的某些应用程序(具有一些不同的状态,如android中的一个普通wifi指示器)。返回的数字取决于RSSI参数。因此,即使两个接入点的RSSI略有不同,此方法也会产生相同的结果。如果需要更精细的可分辨结果,请使用大于10的数字或RSSI值本身。

以下是代码:

public int getWifiSignalState(Context ctx) {
    int signalStrength = -1;
    try {
        final WifiManager wifi = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
        int state = wifi.getWifiState();
        if(state == WifiManager.WIFI_STATE_ENABLED) {
            List<ScanResult> results = wifi.getScanResults();
            if(results == null)
                return signalStrength;
            for (ScanResult result : results) {
                if(result != null && wifi != null && wifi.getConnectionInfo() != null && result.BSSID != null
                        && result.BSSID.equals(wifi.getConnectionInfo().getBSSID())) {
                    int level = 0;
                    level = calculateSignalLevel(wifi.getConnectionInfo().getRssi(), result.level);

                    // this is to handle java.lang.ArithmeticException: divide by zero
                    if(level != 0 && result.level != 0) {
                        // convert signal strength into percentage
                        int difference = level * 100 / result.level;
                        if(difference >= 100)
                            signalStrength = 4;
                        else if(difference >= 75)
                            signalStrength = 3;
                        else if(difference >= 50)
                            signalStrength = 2;
                        else if(difference >= 25)
                            signalStrength = 1;
                    }
                }

            }
        }
    } catch(Exception e) {
        ErrorReporter.handleSilentException(ctx, e);
    }

    return signalStrength;
}
public int getWifiSignalState(上下文ctx){
int信号强度=-1;
试一试{
最终WifiManager wifi=(WifiManager)ctx.getSystemService(Context.wifi_服务);
int state=wifi.getWifiState();
如果(状态==WifiManager.WIFI\u状态\u已启用){
列表结果=wifi.getScanResults();
如果(结果==null)
返回信号强度;
用于(扫描结果:结果){
如果(result!=null&&wifi!=null&&wifi.getConnectionInfo()!=null&&result.BSSID!=null
&&result.BSSID.equals(wifi.getConnectionInfo().getBSSID()){
智力水平=0;
级别=计算信号级别(wifi.getConnectionInfo().getRssi(),result.level);
//这是为了处理java.lang.arithmetricException:除以零
如果(级别!=0&&result.level!=0){
//将信号强度转换为百分比
整数差=等级*100/结果等级;
如果(差值>=100)
信号强度=4;
否则如果(差异>=75)
信号强度=3;
否则如果(差异>=50)
信号强度=2;
否则如果(差异>=25)
信号强度=1;
}
}
}
}
}捕获(例外e){
ErrorReporter.handleSilentException(ctx,e);
}
返回信号强度;
}
//此方法修复了android 2.3除以零异常的问题

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;
}
public int-calculateSignalLevel(int-rssi,int-numLevels){
如果(rssi=最大值){
返回numLevels-1;
}否则{
浮点输入范围=(最大值-最小值);
浮点输出范围=(numLevels-1);
如果(输入范围!=0)
返回(int)((浮点)(rssi-MIN_rssi)*输出量程/输入量程);
}
返回0;
}

函数
WifiManager.calculateSignalLevel(int RSSI_level,int range)
将RSSI level作为第一个参数,将范围作为第二个参数

第二个参数很容易理解。基本上,该函数返回一个范围为[0到范围-1]的值

第一个参数必须在
MIN\u RSSI
MAX\u RSSI
范围内。任何
=MAX\u RSSI
都会返回作为第二个参数传递的值,减去1
(范围-1)

关键信息是:
MIN_RSSI
被定义为一个常数,等于-100,
MAX_RSSI
等于-55。在这两个值之间传递的任何值都将被标准化


当您传递的值高于
MAX\u RSSI
时,函数始终返回相同的值。

即使使用40的刻度,我也会得到相同的错误。对于50,我会得到一个除以零的算术exception@Sarath,这个fn有一个从未被修复过的bug,它会导致DBZ执行,但是即使您解决了这个问题它实际上不起作用(返回的值超出范围)。