¿Cómo obtener la fuerza de conexión de los puntos de acceso Wifi?

Estoy construyendo una aplicación que lee la intensidad de la señal de cada punto de acceso Wifi disponible.

He escrito código como:

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(); 

Sin embargo, tengo dos problemas:

  1. En la depuración, configs sólo contiene una conexión. Sin embargo, puedo ver que hay varios AP disponibles en la configuración wifi del sistema. Es decir configs es una lista incompleta.

  2. No sé cómo obtener la intensidad de la señal en WifiConfiguration .

Btw, estoy usando HTC Hero y Android 1.5.

Según la documentación de la API de Android, WifiManager.getConfiguredNetworks () no rellena los parámetros de intensidad de señal. Estos datos sólo representan los puntos de acceso recordados, no los visibles.

Para obtener redes realmente visibles debe llamar a WifiManager.startScan () para iniciar la exploración de radio WiFi y WifiManager.getScanResults () después de un tiempo para obtener los resultados de escaneado.

Debajo del código ayudará a conseguir la barra de 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)); 
 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(); } } 

Donde scanResult.SSID da la fuerza de la señal.

  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. 
 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 } } } 
  • Java.net.SocketException: recvfrom falló: ECONNRESET (Conexión restablecida por pares) Más de WIFI
  • Android y WiFi Direct - Problemas de conexión
  • Wifi y 3G a la misma hora
  • Desactivación de Samsung "Auto Network Switch" para conexión WiFi
  • Android wifiManager.addNetwork devuelve -1
  • ¿Es posible eliminar los grupos Wifi Direct de Android programados?
  • Retraso / retraso enorme de UDP con Android
  • ¿Cómo pueden los usuarios / desarrolladores configurar la configuración de proxy de Android para las versiones 2.x?
  • Wi-Fi Android punto de acceso - sin Internet
  • Android wifi sniffer: encuentra dispositivos cercanos
  • ¿Cómo obtener el nombre de la red wifi fuera de android utilizando la API de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.