在安卓设备中获取WiFi信号强度

57

使用以下代码,我可以获取WiFi信号水平的dBm值。

for (ScanResult result : wifiScanResultList) {
    int signalLevel = result.level;
}

它给出负值。当我们查看默认系统WiFi设置并单击连接的WiFi网络时,它会以"好"或"坏"作为信号强度显示。我们可以将哪些负数过滤为"好"信号强度或"坏"信号强度的范围是多少?


3
dBm大多数情况下是负值吗? - A--C
是的,没错。我需要一个标准范围,可以应用于我自己的WiFi处理Android应用程序。当我在真实设备上点击连接的WiFi网络时,它会显示“Good”作为信号强度。我想知道他们如何将其测量为“Good”强度。感谢您的回复。 - AnujAroshA
1
这是你问题的答案:http://androidxref.com/4.2_r1/xref/frameworks/base/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java#103 - Oleksandr Kravchuk
7个回答

74

这是一篇老帖子,但可能对某些人有帮助......

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int numberOfLevels = 5;
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels);

文档:public static int calculateSignalLevel (int rssi, int numLevels)


2
如何知道信号强度,非常强烈,例如如果我们得到3、4,那么字符串是什么。 - Alok Tiwari
3
注意:文档中指出需要应用程序上下文作为输入上下文! - chksr
@AlokTiwari 即使我站在无线网络旁边,我最多只能获得4级信号。 - Tarun
该方法已被弃用。 - Greelings
为什么要使用5?在 numberOfLevels 中使用3即可。1 表示差,2 表示一般,3 表示强。 - Sambhav Khandelwal

37
请查看接收到的无线信号功率以dBm值表示的方式。
优秀 >-50 dBm
良好 -50至-60 dBm
一般 -60至-70 dBm
较弱 < -70 dBm

25
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

// Level of a Scan Result
List<ScanResult> wifiList = wifiManager.getScanResults();
for (ScanResult scanResult : wifiList) {
  int level = WifiManager.calculateSignalLevel(scanResult.level, 5);
  System.out.println("Level is " + level + " out of 5");
}

// Level of current connection
int rssi = wifiManager.getConnectionInfo().getRssi();
int level = WifiManager.calculateSignalLevel(rssi, 5);
System.out.println("Level is " + level + " out of 5");

对于WiFi它能很好地工作,但我们如何计算移动数据的信号级别? - Shweta Chauhan
我即使站在无线网络旁边,也只能获得最多4级信号。 - Tarun
@ShwetaChauhan 你找到了持续监控移动数据的解决方案吗? - Kuldeep Bhimte
嗨@se_bastiaan,最高等级为4,最低等级为0(因此有5个等级)。您的日志将永远不会显示“5/5”。 - Gayal Rupasinghe
@Tarun,这是因为你的网络可能很慢。 - Sambhav Khandelwal

8
是的,没错。这就是接收信号功率dBm值的表示方法。这里有维基百科上的一些细节。
-100表示最低值(根本没有信号),而0表示极好的信号(100%)。

1
0并不是100%。接收信号强度可以高于0 dBm。>= -51 dBm通常意味着100%。 - Thomas
@Thomas,你说的话太荒谬了。在发表这种言论之前,你有没有查看链接的维基百科页面或自己进行研究? - Oleksandr Kravchuk
与你不同,我似乎对无线系统知道更多,否则你就不会写“胡说八道”了。你提供的维基百科链接只列出了无线电台的发射功率等信息。此外,“-100”并不是最低值……例如GSM仍可在低于-100 dBm的情况下工作。 - Thomas
2
我现在给这个答案点了个踩,因为关于接收信号强度(RSSI)的回答完全是错误的。请做一些研究。这里的答案:https://dev59.com/k2Yr5IYBdhLWcg3wIG1u#33689523 是正确的。 - Thomas
RSSI = -100并不意味着没有信号。它意味着接收到的信号功率比1 mW低100 dB。是的,这可能意味着一个实际上无用的信号。不,这并不意味着“没有信号”。同样,极好的信号并不意味着100%。没有定义的100%信号。四个中的四个条形图仅是GUI,但并不意味着“100%”。这个答案没有用。-1 - Roland

8

您已经得到了信号强度值,下面是一个代码示例,可以将Wi-Fi信号分为高、中、低三个级别。

    int level = result.level;

    if (level >= -50) {
        //Best signal
    } else if (level >= -70) {
        //Good signal         
    } else if (level >= -80) {
        //Low signal
    } else if (level >= -100) {
       //Very weak signal
    } else {
       //Too low signal
    }

0

以下是三星A7使用的WiFi信号级别:

return when (rssi) {
    in -63..-1 -> 4
    in -73..-64 -> 3
    in -83..-74 -> 2
    in -93..-84 -> 1
    else -> 0
}

我认为其他品牌应该也差不多。


-1

WifiManager.java中的常量略有不同,因此我将在此添加它们:

MIN_RSSI:任何比-100更差或相等的信号将显示0格

MAX_RSSI:任何比-55更好或相等的信号将显示最大格数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接