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:
- Detección de la configuración "Utilizar sólo redes 2G"
- Android Bluetooth Serial RFCOMM velocidad baja en baudios / transmisión lenta
- Verfiying Network Connection en Android
- ConnectivityManager getActiveNetworkInfo () siempre es nulo incluso con tráfico de datos activo
- Android 5.0 Lollipop y 4.4 KitKat ignora mi red WiFi, enableNetwork () es inútil
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.
- ¿Cómo configurar el modo de conexión USB?
- Envío de datos a la impresora térmica desde el dispositivo Android a través de USB
- ¿Cómo detectar la conectividad de red limitada en Android?
- Android - Preguntas sobre la conectividad
- Problema para recuperar ConnectivityManager en un dispositivo con multi sim
- Android simular baja conectividad de red
- ConnectivityManager puntero nulo
- GetBoolean (EXTRA_NO_CONNECTIVITY) siempre devuelve false
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
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 evitar que se ejecute doble código haciendo clic dos veces rápido en un botón de Android
- ¿Cómo establecer la posición del diálogo?