9


Im tratando de recibir BroadcastMessages de CONNECTIVITY_ACTION:BroadcastReceiver para CONNECTIVITY_ACTION siempre devuelve un valor nulo en intent.getExtras()

// register BroadcastReceiver on network state changes 
    final IntentFilter mIFNetwork = new IntentFilter(); 
    mIFNetwork.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); //"android.net.conn.CONNECTIVITY_CHANGE" 
    registerReceiver(mIRNetwork, mIFNetwork); 

y el receptor es:

private BroadcastReceiver mIRNetwork = new BroadcastReceiver() { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 

     android.util.Log.i(TAG,"mIRNetwork: Network State Received: "+intent.getAction()); 
     Bundle extras = intent.getExtras(); 
     if (extras!=null){ 
       android.util.Log.i(TAG,"mIRNetwork: ACTION_BACKGROUND_DATA_SETTING_CHANGED: "+extras.getString(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED)); 
       android.util.Log.i(TAG,"mIRNetwork: CONNECTIVITY_ACTION: "+extras.getString(ConnectivityManager.CONNECTIVITY_ACTION)); 
       android.util.Log.i(TAG,"mIRNetwork: EXTRA_EXTRA_INFO: "+extras.getString(ConnectivityManager.EXTRA_EXTRA_INFO)); 
       android.util.Log.i(TAG,"mIRNetwork: EXTRA_NO_CONNECTIVITY: "+extras.getString(ConnectivityManager.EXTRA_NO_CONNECTIVITY)); 
       android.util.Log.i(TAG,"mIRNetwork: EXTRA_REASON: "+extras.getString(ConnectivityManager.EXTRA_REASON)); 

      } 
     } 

en extras cortos siempre es nula. Pensé que si pierdo la conexión WiFi debería obtener EXTRA_NO_CONNECTIVITY (porque es la única forma de acceder a Internet) o al menos algo de la lista. Pero sin suerte. Si desconecto mi receptor WiFi AP recibe su mensaje pero con extras nulos. Cuando enciendo mi WiFi otra vez, el receptor dispara pero no hay extras ... ¿Por qué? ¿Cómo saber que la aplicación perdió alguna conexión de red? Pensé que era el camino.

Respuesta

13

No se puede obtener extra, pero se puede obtener datos de esta manera

private class ConnectivityBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager 
       .EXTRA_NO_CONNECTIVITY, false); 
     NetworkInfo info1 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager 
       .EXTRA_NETWORK_INFO); 
     NetworkInfo info2 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager 
       .EXTRA_OTHER_NETWORK_INFO); 
     String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 
     boolean failOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 
     Log.d("MY_TAG", "onReceive(): mNetworkInfo=" + info1 + " mOtherNetworkInfo = " + 
       (info2 == null ? "[none]" : info2 + " noConn=" + noConnectivity)); 
    } 
} 

Para más información ver esta

http://code.google.com/p/androidwisprclient/source/browse/trunk/src/com/joan/pruebas/NetworkConnectivityListener.java?r=2

+0

'if (! (Action.equals ConnectivityManager.CONNECTIVITY_ACTION))' puede' Entiendo esto cuando la única acción agregada al filtro es CONNECTIVITY_ACTION? –

+0

@MuhammadBabar Puede ignorar la condición para verificar la acción si ha registrado solo una acción para la conectividad. – Dharmendra

+0

Para comprobar si tenemos conexión a Internet, ¿es seguro usar "! Intent.getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)"? –

4

Dharmendras answer es bueno. Sin embargo, tenga en cuenta que EXTRA_NETWORK_INFO ahora es obsoleto (ya Api nivel 14) y la documentación de Android dicen lo siguiente:

Desde NetworkInfo puede variar en función de UID, aplicaciones siempre debe obtener información de la red a través getActiveNetworkInfo().

Eso realmente nos facilita las cosas. Se podría volver a utilizar la conectividad comprobar probablemente lo hizo antes y hacer algo como esto:

private class ConnectivityBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this) 
     checkConnection(); 
    } 
} 

private void checkConnection() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
    if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo() 
      .isConnectedOrConnecting()) { 
     // do something 
    } 
} 

Suponiendo que estás dentro de la actividad que registró la emisión por supuesto.

Esto también tiene la ventaja añadida de seguir las mejores prácticas para escuchar solamente para la emisión conectividad lo más brevemente posible, outlined here :)

+0

esto no funciona, siempre se llama dos veces – huluyige

Cuestiones relacionadas