¿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:
- Establecer la configuración de IP de Android, DNS, GATEWAY mediante programación
- ¿Cómo puedo llamar a la pantalla de configuración Wi-Fi de mi aplicación mediante Android
- Cómo comprobar el Internet real conectado en android?
- Android 6.0 comprueba si está conectado a una red Wi-Fi (sin Internet)
- ¿Cuál es la diferencia entre la exploración activa y la exploración pasiva?
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:
-
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 decirconfigs
es una lista incompleta. -
No sé cómo obtener la intensidad de la señal en
WifiConfiguration
.
Btw, estoy usando HTC Hero y Android 1.5.
- Cómo detener la exploración wifi en Android?
- Búsqueda de puntos de acceso Wi-Fi en Android mientras está en modo punto de acceso
- ¿Cómo conectar wifi android a adhoc wifi?
- Descubrir dispositivos móviles usando wifi
- Wi-Fi tethering - cómo obtener la lista de clientes conectados
- ¿Puede una red bluetooth o wifi (spp) perder alguna vez los bytes o haber corrompido?
- Android: Activar / desactivar WiFi Hotspot mediante programación en Android Marshmallow (6.0)
- Ruta de las solicitudes de red sólo a través de la conexión de datos móviles
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 } } }
- AlertDialog Tema: ¿Cómo cambiar el color del texto del artículo?
- ¿Cuál es la longitud máxima para un nombre de aplicación de Android?