Compruebe la conexión a Internet de INTENT
¿Hay un Android Intent ACTION_XXX
que me notifica cuando Internet Connection está disponible? Yo instanciaría un BroadcastReceiver
que notificaría mi aplicación cuando un usuario habilite la Conexión a Internet (por wifi, por GSM, etc …)
¿Podría alguien ayudarme?
- Android: detecta cuando la aplicación está instalada
- Android Broadcast Receiver para enviar mensajes SMS?
- Registrarse en la transmisión local dentro de una vista personalizada
- Detectar cuando el roaming está desactivado en Android
- ¿Es el contexto de la aplicación siempre el mismo sin importar la clase?
- servicio androide para realizar un seguimiento de las llamadas salientes y SMS en segundo plano
- Receptor de radiodifusión en fragmento no recibe intención de servicio
- Botón de captura de medios en Android> = 4.0 (funciona en 2.3)
- El widget de Android funciona bien en el emulador pero en el teléfono se convierte en el widget de Google App
- ¿Cómo detectar el cambio de estado Bluetooth con un receptor de difusión?
- ¿Qué es más eficiente Broadcast Receiver o Handler?
- Android: escucha el mensaje de difusión instalado / actualizado de la aplicación
- ¿Cómo cancelar la notificación de difusión? (Para una emisión no ordenada)
<receiver android:name=".YOURRECEIVER"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
La respuesta aceptada es correcta. Sólo agrego el código del receptor para completarlo:
public class NetworkStateReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.d("app","Network connectivity change"); if(intent.getExtras()!=null) { NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { Log.i("app","Network "+ni.getTypeName()+" connected"); } else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { Log.d("app","There's no network connectivity"); } } }
Actualizar a @lujop respuesta:
public class NetworkStateReceiver extends BroadcastReceiver { private static final String TAG = "NetworkStateReceiver"; @Override public void onReceive(final Context context, final Intent intent) { Log.d(TAG, "Network connectivity change"); if (intent.getExtras() != null) { final ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); final NetworkInfo ni = connectivityManager.getActiveNetworkInfo(); if (ni != null && ni.isConnectedOrConnecting()) { Log.i(TAG, "Network " + ni.getTypeName() + " connected"); } else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { Log.d(TAG, "There's no network connectivity"); } } } }
MyReceiver.java
public class MyReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(isConnected(context)) Toast.makeText(context, "Connected.", Toast.LENGTH_LONG).show(); else Toast.makeText(context, "Lost connect.", Toast.LENGTH_LONG).show(); } public boolean isConnected(Context context) { ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnected(); return isConnected; } }
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application .............. <receiver android:name="com.example.broadcastreceiversample.MyReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> </application>
Respuesta continua del mow mwo
Puede activar / desactivar el receptor mediante:
habilitar
ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class); PackageManager pm = this.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT).show(); }
inhabilitar
ComponentName receiver = new ComponentName(MainActivity.this, MyReceiver.class); PackageManager pm = this.getPackageManager(); pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); Toast.makeText(this, "Enabled broadcast receiver", Toast.LENGTH_SHORT).show(); }
Donde, el mismo puede ser llamado en un Intent o en onCreate
La parte que falta de todas las respuestas es un recordatorio para registrarse para esa acción:
IntentFilter filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); registerReceiver(your_receiver, filter);
Estoy usando la transmisión para comprobar la conexión cada vez. Cree una clase para información de conexión.
import android.content.Context; import android.content.ContextWrapper; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class ConnectivityStatus extends ContextWrapper{ public ConnectivityStatus(Context base) { super(base); } public static boolean isConnected(Context context){ ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo connection = manager.getActiveNetworkInfo(); if (connection != null && connection.isConnectedOrConnecting()){ return true; } return false; } }
Aplique el código en su Actividad:
private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(!ConnectivityStatus.isConnected(getContext())){ // no connection }else { // connected } } };
Registre la transmisión en el método onCreate()
su actividad:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); .. ... .... }
No se olvide de no registrarse / registrarse en el ciclo de actividad:
@Override protected void onResume() { super.onResume(); your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } @Override protected void onPause() { super.onPause(); your_activity_context.unregisterReceiver(receiver); }
NetworkInfo.isConnected()
es un método poco confiable para probar el estado de Internet, devolverá true cuando existe una conexión de red aunque no tenga acceso a Internet (por ejemplo, wifi sin Internet). Un enfoque más fiable sería utilizar ping
con un CONNECTIVITY_ACTION
BroadcastReceiver
:
private void registerInternetReceiver() { if (this.internetReceiver != null) return; this.internetReceiver = new BroadcastReceiver() { @Override public void onReceive (Context context, Intent intent) { if (isInternetAvailable()) Log.i ("Tag", "internet status online"); else Log.i ("Tag", "internet status offline"); } }; IntentFilter filter = new IntentFilter(); filter.addAction (ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver (internetReceiver, filter); } private boolean isInternetAvailable() { try { return (Runtime.getRuntime().exec ("ping -c 1 google.com").waitFor() == 0); } catch (Exception ex) { ex.printStackTrace(); } return false; }
Este código funcionará (en todas las versiones), ya que el registro de manifiesto no funcionará para los dispositivos 7+ (API 25 y superiores).
private void foo(){ registerReceiver(connectionBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); } private BroadcastReceiver connectionBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent == null || intent.getExtras() == null) return; ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) { } } } } };
Leería los documentos actualizados para turrón +, porque la intención está obsoleta debido al número de dispositivos, la información de red por sí sola no es suficiente. Utilizaría los comandos del gestor de conectividad (acciones de conectividad, añadir variables allí), ya que la mayoría ha cambiado en el último año, y en la prueba, habilitar los datos de la celda siempre activos, registro detallado y transferencia agresiva, utilice el filtro wlan si es necesario :
https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION
- Android: checkbox listener
- Android 4.1: ¿Cómo comprobar las notificaciones están deshabilitadas para la aplicación?