Android 与wifimanager.calculatesignalstrenth有关的问题
我使用以下代码计算wifi信号强度: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();
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执行,但是即使您解决了这个问题它实际上不起作用(返回的值超出范围)。