2011-07-06 16 views
6

Parte de la funcionalidad de mi aplicación es escanear y mostrar una lista de puntos de acceso WiFi, y luego conectar con el elegido por el usuario. Tengo esta funcionalidad funcionando. Ahora, también deseo recibir una notificación cuando la conexión "se realice". Esto debería ser bastante simple, pero me encuentro tropezando.WIFI_STATE_CHANGED_ACTION intento no recibido al conectarse al punto de acceso WiFi?

He leído varias publicaciones aquí en SO, y todas mencionan registrarse en WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION o WifiManager.WIFI_STATE_CHANGED_ACTION. Sin embargo, ninguno de estos funciona para mí. ¿Alguien puede detectar cualquier error en este código? (Me voy a cabo las partes que hacen la exploración y esas cosas)

comportamiento esperado: Tan pronto como la conexión se realiza correctamente (es decir, cuando veo el icono de "conectado" en la barra de notificaciones), la Se debe recibir la transmisión y debería ver el brindis.

comportamiento observado: La emisión se recibe cuando se inicia la aplicación en primer lugar, y cada vez que volver a él (es decir, cada vez que onResume() se llama, o sospecho, cada vez que me registro en el intento)

public class WifiScanActivity extends Activity { 

    WifiManager mainWifi; 
    WifiReceiver mWifiReceiver; 
    IntentFilter mIntentFilter; 
    private final static String TAG = "WifiScanActivity"; 
    public static final String INTENT_FOR_WIFI_CONNECTED = 
      WifiManager.WIFI_STATE_CHANGED_ACTION; 
    // public static final String INTENT_FOR_WIFI_CONNECTED = 
    // WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     mWifiReceiver = new WifiReceiver(); 
     mIntentFilter = new IntentFilter(); 
     mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
     mIntentFilter.addAction(INTENT_FOR_WIFI_CONNECTED); 
     registerReceiver(mWifiReceiver, mIntentFilter); 
     mainWifi.startScan(); 
    } 

    protected void onPause() { 
     unregisterReceiver(mWifiReceiver); 
     super.onPause(); 
    } 

    protected void onResume() { 
     registerReceiver(mWifiReceiver, mIntentFilter); 
     super.onResume(); 
    } 

    class WifiReceiver extends BroadcastReceiver { 

     public void onReceive(Context c, Intent intent) { 
      Log.d(TAG, 
       "In WifiReceiver: Broadcast Received = " + intent.getAction()); 
      if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent 
       .getAction())) { 
       // Display the ListView and connect to the selected AP 
      } else if (INTENT_FOR_WIFI_CONNECTED.equals(intent.getAction())) { 
       if (WifiManager.WIFI_STATE_ENABLED == intent.getIntExtra(
        WifiManager.EXTRA_WIFI_STATE, 0)) { 
        displayNetworkInfo(); 
       } 
       /*if(true == intent.getBooleanExtra(
       * WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)){ 
       * displayNetworkInfo(); 
       }*/ 
      } 
     } 
    } 

    private void displayNetworkInfo() { 
     WifiInfo wifiInfo = mainWifi.getConnectionInfo(); 
     String ssid = wifiInfo.getSSID(); 
     int ip = wifiInfo.getIpAddress(); 
     String message = "Connection established.\nSSID = " + ssid 
      + "; IP Address = " + Helper.displayIpAddress(ip); 
     Log.d(TAG, message); 
     Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
    } 
} 

Si elimino el comentario del código de WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION, no veo la transmisión en absoluto.

Nota: Yo sé que la conexión es exitosa porque veo el estado en pantalla de configuración de WiFi del androide.

Respuesta

19

Ok, lo he descubierto. Resulta que me estaba inscribiendo con el intento equivocado. Debería usar WifiManager.NETWORK_STATE_CHANGED_ACTION.

Éstos son los fragmentos de partes relevantes de código:

mIntentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) ; 
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 


public void onReceive(Context c, Intent intent) { 

if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) { 

    NetworkInfo nwInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
    if(NetworkInfo.State.CONNECTED.equals(nwInfo.getState())){//This implies the WiFi connection is through 
     displayNetworkInfo(); 
    } 
} 
-1

Para obtener el estado de emisión después se cambió ver this

+2

El artículo se ha vinculado a muestra cómo para recibir difusión cuando los resultados de escaneo están disponibles. Mi aplicación ya lo está haciendo con éxito. Lo que necesito es recibir una transmisión tan pronto como la conexión WiFi a un punto de acceso sea exitosa. No vi nada relacionado con esto en el artículo. – curioustechizen

0

yo era capaz de detectar después de la adición de estos permisos a manifestarse para detectar la emisión:

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