Android WIFI Cómo detectar cuando la conexión WIFI específica está disponible

Necesito detectar cuando tengo conectividad de red a una red WIFI ESPECÍFICA.

Por ejemplo: tan pronto como entras en tu casa y tu teléfono recoge la red wifi de tu hogar, me gustaría recibir una notificación que diga “No estás en la red de tu hogar, ¿te gustaría conectarte a tu casa?” Pero me gustaría que eso solo suceda cuando estoy en mi casa específica.

¿Qué debo escuchar y qué pruebas debo hacer para asegurarme de que sea mi red doméstica específica y no otra red?

Puede usar BroadcastReceiver para descubrir que la red wifi ha cambiado:

BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); context.registerReceiver(broadcastReceiver, intentFilter); 

El BroadcastReceiver puede verse así. Y para verificar la dirección MAC específica, consulte el método checkConnectedToDesiredWifi () a continuación.

 public class WifiBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION .equals(action)) { SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); if (SupplicantState.isValidState(state) && state == SupplicantState.COMPLETED) { boolean connected = checkConnectedToDesiredWifi(); } } } /** Detect you are connected to a specific network. */ private boolean checkConnectedToDesiredWifi() { boolean connected = false; String desiredMacAddress = "router mac address"; WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifi = wifiManager.getConnectionInfo(); if (wifi != null) { // get current router Mac address String bssid = wifi.getBSSID(); connected = desiredMacAddress.equals(bssid); } return connected; } } 

Siempre y cuando no tengamos nada que ver con el código que necesita, para obtener un servicio gratuito , solo puedo recomendarle que lea todo lo posible sobre Android y sus posibilidades de red / wifi al crear dicha aplicación.

  • Fuentes que deberías leer y estudiar

http://developer.android.com/reference/android/net/wifi/package-summary.html
cómo ver si wifi está conectado en Android
Cómo obtener mi wifi hotspot en mi sistema android actual
¿Cómo obtener el nombre de la red wifi de Android usando la API de Android?
Obtener el nombre de la interfaz de WiFi en Android

  • Permisos que deberías pedir al crear el manifiesto de la aplicación

AndroidManifest.xml

        

( el último, solo si desea que detecte su ubicación, para evitar llamadas innecesarias )

  • También debe declarar que su aplicación necesita que wifi esté disponible en el dispositivo para que funcione correctamente:

AndroidManifest.xml

  

Use el código estándar para enumerar todas las redes disponibles:

  • comenzar el escaneo

     String connectivity_context = Context.WIFI_SERVICE; final WifiManager wifi = (WifiManager) getSystemService(connectivity_context); if (wifi.isWifiEnabled()) { wifi.startScan(); } 
  • registrar un receptor para los datos

     IntentFilter i = new IntentFilter(); i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent i) { // TODO Auto-generated method stub ScanWiFiActivity a = ScanWiFiActivity.instance(); WifiManager w = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); List l = w.getScanResults(); a.Clear(); for (ScanResult r : l) { //use r.SSID or r.BSSID to identify your home network and take action a.setText(r.SSID + "" + r.level + "\r\n"); } } }; registerReceiver(receiver, i); 

En el bloque FOR, trabaja tu magia y actúa cuando identifiques tu red por SSID o BSSID

Tenía exactamente el mismo problema para un proyecto mío y me tomó un tiempo encontrar una solución.

En primer lugar, “conectarse a un WiFi” es algo muy abstracto, y resulta muy correcto. En la práctica, las personas generalmente significan todo lo siguiente:

  • autenticado con un punto de acceso WiFi
  • asociado con el punto de acceso
  • obtuvo una dirección IP de la red

Todas estas etapas (y varias más) están asociadas a diferentes eventos Andoid. Entonces, sin más preámbulos, aquí está mi código (ligeramente modificado):

 public class MyService extends Activity { // or Service //... Other stuff BroadcastReceiver awaitIPAddress = null; private final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { if (intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE) == SupplicantState.COMPLETED) { //WiFi is associated WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wi = wifiManager.getConnectionInfo(); if (wi != null) { // Wifi info available (should be, we are associated) if (wi.getIpAddress() != 0) { // Lucky us, we already have an ip address. // This happens when a connection is complete, eg after rekeying if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) { // ... Do your stuff here // ... // ... } } else { // No ip address yet, we need to wait... // Battery friendly method, using events if (awaitIPAddress == null) { awaitIPAddress = new BroadcastReceiver() { @Override public void onReceive(Context ctx, Intent in) { WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wi = wifiManager.getConnectionInfo(); if (wi != null) { if (wi.getIpAddress() != 0) { if (wi.getBSSID().equals("c0:ff:ee:c0:ff:ee")) { // ... Do your stuff here // ... // ... } } } else { ctx.unregisterReceiver(this); awaitIPAddress = null; } } }; // We register a new receiver for connectivity events // (getting a new IP address for example) context.registerReceiver(awaitIPAddress, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } } } } else { // wifi connection not complete, release ip address receiver if registered if (awaitIPAddress != null) { context.unregisterReceiver(awaitIPAddress); awaitIPAddress = null; } } } } }; //... Other stuff @Override public void onCreate() { super.onCreate(); //... Other stuff IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); registerReceiver(receiver, filter); //... Other stuff } //... Other stuff } 

Además, no descuides los permisos apropiados para el manifiesto:

   

Y sospecho fuertemente que también necesitarás: