代码之家  ›  专栏  ›  技术社区  ›  Yin Zhu

如何获取WiFi接入点的连接强度?

  •  13
  • Yin Zhu  · 技术社区  · 14 年前

    我正在构建一个应用程序,读取每个可用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();
    

    但是,我有两个问题:

    1. 调试时, configs 仅包含一个连接。但是,我可以看到系统的WiFi设置中有几个AP可用。即。 组态 是一个不完整的列表。

    2. 我不知道怎样才能获得信号强度 WifiConfiguration .

    顺便说一句,我使用的是HTC英雄和Android 1.5。

    5 回复  |  直到 8 年前
        1
  •  17
  •   Sergii Rudchenko Kevin Dion    14 年前

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

    要获得实际可见的网络,必须调用 WifiManager.startScan() 启动WiFi无线扫描和 WifiManager.getScanResults() 过了一会儿才能得到扫描结果。

        2
  •  7
  •   AJit    12 年前

    以下代码将有助于获得WiFi条:

    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));
    
        3
  •  3
  •   Asad Rao    13 年前
    mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    receiverWifi = new WifiReceiver();
        registerReceiver(receiverWifi, new IntentFilter(
                WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
    
            List<ScanResult> wifiList = mainWifi.getScanResults();
            ArrayList<WifiConnectionBean> m4MessagesList = new ArrayList<WifiConnectionBean>();
            for (int i = 0; i < wifiList.size(); i++) {
                ScanResult scanResult = wifiList.get(i);
                WifiConnectionBean bean = new WifiConnectionBean();
                bean.setConnectionName(scanResult.SSID); // + "--" +
                                                            // scanResult.frequency);
                bean.setDescription(scanResult.capabilities);
                bean.setId(scanResult.SSID);
                bean.setLevel(String.valueOf(scanResult.level));
                bean.setSignalStrength(String.valueOf(scanResult.BSSID));
                m4MessagesList.add(bean);
            }
            if (m4MessagesList == null) {
                Toast.makeText(WifiIdentificationActivity.this,
                        "WifiConnection not available", Toast.LENGTH_SHORT)
                        .show();
            } else {
                String message = "Scanning complete. " + m4MessagesList.size()
                        + " connections found!";
            }
            pd.dismiss();
    
        }
    }
    

    其中scanResult.ssid提供信号强度。

        4
  •  1
  •   Issac Balaji    9 年前
    private void checkNetworkStrengh() {
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo Info = cm.getActiveNetworkInfo();
            if (Info == null || !Info.isConnectedOrConnecting()) {
                Log.i(TAG, "No connection");
            } else {
                int netType = Info.getType();
                int netSubtype = Info.getSubtype();
    
                if (netType == ConnectivityManager.TYPE_WIFI) {
                    Log.i(TAG, "Wifi connection");
                    WifiManager wifiManager = (WifiManager) getApplication().getSystemService(Context.WIFI_SERVICE);
                    List<ScanResult> scanResult = wifiManager.getScanResults();
                    for (int i = 0; i < scanResult.size(); i++) {
                        Log.d("scanResult", "Speed of wifi"+scanResult.get(i).level);//The db level of signal 
                    }
    
    
                    // Need to get wifi strength
                } else if (netType == ConnectivityManager.TYPE_MOBILE) {
                    Log.i(TAG, "GPRS/3G connection");
                    // Need to get differentiate between 3G/GPRS
                }
            }
        }
    
        5
  •  1
  •   Junior Zancan    8 年前
        WifiManager wifiManager = (WifiManager)
        MonitorActivity.this.getSystemService(Context.WIFI_SERVICE);
    
        wifiManager.addNetwork(conf);
    
        int numberOfLevels = 5;
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels);
    
        Log.e("level", "" + level);
        // you will get the levels. Using these levels you can calculate strenghts.