BroadcastReceiver para CONNECTIVITY_ACTION devuelve siempre null en intention.getExtras ()

Estoy tratando de recibir BroadcastMessages de CONNECTIVITY_ACTION:

// 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 nulo. Pensé que si pierdo la conexión WiFi debería obtener EXTRA_NO_CONNECTIVITY (cuz es la única forma de Internet) o al menos algo de la lista. Pero no hay suerte. Si desconecto mi receptor WiFi AP obtiene su mensaje pero con extras nulos. Cuando vuelvo a encender mi WiFi una vez más los incendios del receptor, pero no extras … ¿Por qué es eso? ¿Cómo saber que la aplicación ha perdido alguna conexión de red? Pensé que era el camino.

Usted no puede obtener extra, pero 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 vea esto

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

La respuesta de Dharmendras es buena. Sin embargo, tenga en cuenta que EXTRA_NETWORK_INFO está obsoleto (ya que Api Nivel 14) y los documentos Android dicen lo siguiente:

Dado que NetworkInfo puede variar en función del UID, las aplicaciones siempre deben obtener información de red a través de getActiveNetworkInfo() .

Eso realmente hace las cosas muy fáciles para nosotros. Usted podría reutilizar la comprobación de conectividad que probablemente 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 usted está dentro de la actividad que registró la transmisión, por supuesto.

Esto también tiene el beneficio añadido de seguir las mejores prácticas para sólo escuchar para la conectividad difundida tan brevemente como sea posible, se describe aquí 🙂

  • Cómo falsificar un evento conectado Wi-Fi o 3G en Android
  • Android: cambio de conectividad a Internet
  • ¿Cómo comprobar si Internet está disponible o no en el inicio de la aplicación en android?
  • Detectar el tipo de conexión de red en Android
  • Broadcastreceiver para obtener información de ServiceState
  • ¿Por qué funciona el ping en algunos dispositivos y no en otros?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.