我可以在Android中获得低或高的wifi连接

时间:2011-03-11 05:50:05

标签: android

我可以获得低或高的WiFi连接。我的意思是我可以测量从1到5的信号电平。(假设只有一个网络)。我用了computeignallevel。但它要么返回0或1。 亲切的,帮帮我

2 个答案:

答案 0 :(得分:7)

您需要导入以下两个类

import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;

然后,您可以像这样测量wifi信号强度:

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);            
WifiInfo info = wifi.getConnectionInfo();           
int wifiSignalStrength = WifiManager.calculateSignalLevel(info.getRssi(), 4);

//displaying the wifi signal level in a Toast   
Toast.makeText(getApplicationContext(), "signal strength: "+wifiSignalStrength, Toast.LENGTH_LONG).show(); 

答案 1 :(得分:1)

实际上API中的代码存在缺陷;如果您使用46级或更多,它将始终返回0.阅读here以获取更多信息。 我猜大多数人都希望使用101级别来准确计算百分比。

它已在4.0.1及更高版本中修复。我做了这个,所以你可以在任何平台版本上使用它。

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