如何获得Wifi接入点的连接强度?

Yin*_*Zhu 13 android wifi

我正在构建一个应用程序,读取每个可用的Wifi接入点的信号强度.

我编写了如下代码:

    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    // Get WiFi status
    WifiInfo info = wifi.getConnectionInfo();
    textStatus.append("\n\nWiFi Status: " + info.toString());

    // List available networks
    List<WifiConfiguration> configs = wifi.getConfiguredNetworks();
Run Code Online (Sandbox Code Playgroud)

但是,我有两个问题:

  1. 在调试中,configs只包含一个连接.但是,我可以看到系统的wifi设置中有几个AP可用.即configs不完整列表.

  2. 我不知道如何获得信号强度WifiConfiguration.

顺便说一句,我使用的是HTC Hero和Android 1.5.

Ser*_*nko 17

根据Android API文档,WifiManager.getConfiguredNetworks()不会填充信号强度参数.此数据仅表示记住的访问点设置,而不是可见的访问点设置.

要获得实际可见的网络,您必须在一段时间后调用WifiManager.startScan()来启动WiFi无线电扫描和WifiManager.getScanResults()以获得扫描结果.

  • 通常是2-10秒(但实际上没有任何限制).但请记住,如果扫描太短,可能会错过一些可见的接入点.Wi-Fi接入点由周期性发射的特殊广播包(所谓的"信标")检测.扫描接入点实际上意味着监听信标并收集信标.http://www.wi-fiplanet.com/tutorials/article.php/1492071 (3认同)

AJi*_*Jit 7

下面的代码将有助于获得无线网络:

registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            int state = wifi.getWifiState();
            if(state == WifiManager.WIFI_STATE_ENABLED) {
                List<ScanResult> results = wifi.getScanResults();

                for (ScanResult result : results) {
                    if(result.BSSID.equals(wifi.getConnectionInfo().getBSSID())) {
                        int level = WifiManager.calculateSignalLevel(wifi.getConnectionInfo().getRssi(),
                                result.level);
                        int difference = level * 100 / result.level;
                        int signalStrangth= 0;
                        if(difference >= 100)
                            signalStrangth = 4;
                        else if(difference >= 75)
                            signalStrangth = 3;
                        else if(difference >= 50)
                            signalStrangth = 2;
                        else if(difference >= 25)
                            signalStrangth = 1;
                        tv.setText(tv.getText() + "\nDifference :" + difference + " signal state:" + signalStrangth);

                    }

                }
            }
        }
    }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
Run Code Online (Sandbox Code Playgroud)