2012-02-19 14 views
26

Necesito detectar cuando tengo conectividad de red a una red WIFI ESPECÍFICA.Android WIFI Cómo detectar cuando la conexión WIFI específica está disponible

Por ejemplo: Tan pronto como entre en su casa y su teléfono recupere la red WiFi de su hogar, me gustaría recibir una notificación que diga "No está en su red doméstica, ¿desea conectarse con usted? ? " 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 es mi red doméstica específica, y no otra red?

+0

esta [fragmento de código de trabajo] (http://stackoverflow.com/a/15976165/1166727) extrae todo, desde WiFi conectado, redes almacenados en el dispositivo y las redes disponibles en "vista" del dispositivo. –

Respuesta

27

Puede utilizar 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; 
    } 
} 
12

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

  • Fuentes debe leer y estudiar

http://developer.android.com/reference/android/net/wifi/package-summary.html
how to see if wifi is connected in android
How to get my wifi hotspot ssid in my current android system
How to get name of wifi-network out of android using android API?
Get Wifi Interface name on Android

  • permisos que debe hacer para WH en la creación de manifiesto de aplicación

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 

(el último, sólo si desea que le permite detectar su ubicación, para evitar llamadas innecesarias)

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

AndroidManifest.xml

<uses-feature android:name="android.hardware.wifi" /> 
+1

Oye, muchas gracias. Leeré sobre esto. Esta fue mi primera pregunta sobre stackoverflow. Gracias por su respuesta. – ECH5030

+1

@ ECH5030 De nada, señor. No olvides marcar algunas de las respuestas, tal como se aceptaron, que es lo único que puedes hacer. Es una forma común de cerrar el hilo de preguntas en los sitios de control de calidad :) –

3

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

  • iniciar el análisis

    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<ScanResult> 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 PARA bloque de trabajar su magia y tomar medidas cuando se identifica su red SSID o BSSID

+0

¡Esto funciona genial! – Saaram

2

Tuve 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, la gente suele decir todo lo siguiente:

  • autenticado con un punto de acceso Wi-Fi
  • asociado con el punto de acceso
  • tiene una dirección IP de la red

Todas estas etapas (y varios más) están asociados con diferentes eventos Andoid. Así, sin más preámbulos, aquí está mi código (ligeramente modificada):

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, e.g. 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 descuidar los permisos apropiados para el manifiesto:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

Y sospecho fuertemente que también tendrá :

<uses-permission android:name="android.permission.INTERNET"/> 
Cuestiones relacionadas