与wifimanager.calculatesignalstrenth的问题

时间:2011-05-09 03:03:35

标签: android wifimanager

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

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

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

但它为所有wifi接入点返回相同的值。谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:2)

这是代码:

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

//此方法解决了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;
}

答案 1 :(得分:1)

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

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

第一个参数必须在MIN_RSSIMAX_RSSI范围内。任何<=MIN_RSSI返回0,任何>=MAX_RSSI返回您作为第二个参数传递的值减去1 (range-1)

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

当您传递的值高于MAX_RSSI时,该函数始终返回相同的值。

答案 2 :(得分:0)

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