2

次のコードを使用して、wifi 信号強度を計算しています。

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

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

しかし、すべての wifi アクセス ポイントに対して同じ値を返しています。誰が私が間違っているのか教えてもらえますか?

4

3 に答える 3

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;
}
于 2013-04-02T22:12:05.367 に答える
0

WifiManager.calculateSignalLevel(result.level, 10)は 0 ~ 9 の数値のみを返すことに注意してください。したがって、wifi 強度インジケーターを表示するアプリに最適です (Android の通常の WiFi インジケーターのようないくつかの異なる状態があります)。どの数値が返されるかは、RSSI パラメータによって異なります。したがって、2 つのアクセス ポイントの RSSI がわずかに異なっていても、この方法では同じ結果が得られます。より細かい識別結果が必要な場合は、10 より大きい数値を使用するか、RSSI 値自体を使用してください。

于 2011-05-09T07:35:06.020 に答える