WifiManager.startScan 获得
List<ScanResult> getScanResults()
该方法返回一个封装ScanResult对象的list集合 ScanResult对象有RSSI 这个属性 然后调用 calculateSinganlLevel(int rssi,int numLevels) 计算信号强度
// -- Sample WiFi implementation
IntentFilter i = new IntentFilter();
i.addAction
(WifiManager.SCAN_RESULTS_
registerReceiver(new BroadcastReceiver(){
public void onReceive(Context c, Intent i){
// Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event
occurs
WifiManager w = (WifiManager) c.getSystemService
(Context.WIFI_SERVICE);
w.
}
}, i );
// Now you can call this and it should execute the
broadcastReceiver's onReceive()
WifiManager wm = (WifiManager) getSystemService
(Context.WIFI_SERVICE);
boolean a = wm.startScan();
// -- End Wifi Sample
NOTE: I don't think wiFi stuff works in the emulator, and you must set
the correct Wifi permissions in your Application's manifest for it to
work on an actual device.
//里面有个ScanResult 有个属性 level 就可以得到信号的强度,是个负数??
-
Java code
-
WifiManager mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);WifiInfo mWifiInfo = mWifiManager.getConnectionInfo();int wifi = mWifiInfo.getRssi(); // 获取wifi信号强度int linkSpeed = mWifiInfo.getLinkSpeed()
AndroidMenifest.xml中添加权限<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Android的参数大致分成两块:系统服务参数和平台系统信息。 //获取Wi-Fi的连接信息 //获取Wi-Fi的网络状态
|
Android2.2中WifiManager.calculateSignalLevel函数的BUG
android.net.wifi.WifiManager.calculateSignalLevel(int rssi, int numLevels) 当传递的numLevels的值大于等于46的时候,会出现除数为0的错误。
该函数在Android2.2 sdk中的实现如下
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);//当numLevels > 46时,partitionSize = (-55 - -100) / (46 - 1) = 0
return (rssi - MIN_RSSI) / partitionSize;//错误:除数为0
}
}
可以自己实现该函数从而避免这一BUG:
public static int calculateSignalLevel(int rssi, int numLevels){
int MIN_RSSI = -100;
int MAX_RSSI = -55;
int levels = 101;
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);
}
}
参考:
http://code.google.com/p/android/issues/detail?id=2555
http://stackoverflow.com/questions/2873469/issue-with-wifimanager-calculatesignallevelrssi-5