studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-intent broadcastreceiver

android - programacion - Compruebe la conexión a Internet INTENT



manual de programacion android pdf (11)

Desde Android 7 ++, la respuesta de @ fedj no funcionará, pero puede registrar el receptor de difusión mediante programación.

Las aplicaciones orientadas a Android 7.0 (API nivel 24) y superior no reciben transmisiones CONNECTIVITY_ACTION si declaran el receptor de difusión en su manifiesto. Las aplicaciones seguirán recibiendo transmisiones de CONNECTIVITY_ACTION si registran su BroadcastReceiver con Context.registerReceiver () y ese contexto sigue siendo válido.

¿Hay una Intent ACTION_XXX Android Intent ACTION_XXX que me notifique cuando hay una conexión a Internet disponible?

Quiero crear una instancia de un BroadcastReceiver que notifique mi aplicación cuando un usuario habilite la conexión a Internet (por wifi, por GSM, etc.)

¿Alguien podría ayudarme?


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"); } } } }


Este código funcionará (en todas las versiones), ya que el registro del manifiesto no funcionará para dispositivos con más de 7 (API 25 y superiores). Consulte este this .

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) { // connected } } };


Estoy usando broadcast para verificar la conexión todo el tiempo. Crea una clase para la 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; } }

Aplica código en tu 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 olvides 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); }


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);


La respuesta aceptada es correcta. Solo agrego el código del receptor para completar:

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"); } } }


Leería los documentos actualizados para el turrón +, porque el intento está en desuso debido a la cantidad de dispositivos, la información de red por sí sola no es suficiente. Usaría comandos de administrador de conectividad (acción de conectividad, agregue variables allí) y variables, porque la mayoría solo ha cambiado en el último año, y para probar, habilitar datos de celda siempre activos, registro detallado y transferencia agresiva, use filtro wlan si es necesario :

https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION


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>


NetworkInfo.isConnected() es un método no confiable para comprobar el estado de Internet, se devolverá verdadero cuando haya una conexión de red aunque no tenga acceso a Internet (por ejemplo, wifi sin conexión a Internet). Un enfoque más confiable sería usar ping con un CONNECTIVITY_ACTION BroadcastReceiver CONNECTIVITY_ACTION :

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; }


Continuando con la respuesta de mow mwo

puedes activar / desactivar el receptor de la siguiente manera:

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, lo mismo se puede llamar en un intento o en onCreate


<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" />