Detectar WiFi o la red móvil

Necesito notar el cambio de la red en el sistema androide y realizar actividades particulares en consecuencia.

1) Cuando WiFi está habilitado, ejecute la función A. 2) Cuando la red móvil está activada, realice la función B. 3) Cuando WiFi está deshabilitado y la red móvil está habilitada, detenga la función A y comience la función B. 4) Cuando la red móvil está deshabilitada Y WiFi está habilitado, detener la función B y iniciar la función A. 5) Cuando no hay red disponible, no se realiza ninguna función.

He intentado usar CONNECTIVITY_CHANGE. Con esto, recibo la Intención muchas veces, sé su razón también. También hay otro problema. Tenga en cuenta que la red móvil está activada. Ahora, cuando habilito WiFi, me WiFi WiFi habilitado de 2 a 3 veces, también, Mobile Network deshabilitado no se confirmará.

También intenté registrarme con PhoneStateListener.LISTEN_DATA_CONNECTION_STATE. Casi funcionaba, pero cuando WiFi y Mobile Network están activados, sé que WiFi estará activo, y cuando apago WiFi, a veces tengo el mensaje de Mobile Network habilitado ya veces no lo haré.

Necesito resolver este problema. Por favor, ayúdame con tu guía.

Así que en realidad usted tiene cuatro estados como (+ quinto si Internet está allí o no)

Cuando la red está disponible, usted tiene que comprobar para el abastecedor del Internet supervisando los estados de Wifi y de la red móvil, sus cuatro estados son

Wifi cambia de estado y

1. La red móvil está habilitada
2. La red móvil está deshabilitada

Los estados de cambio de red móvil y

1. Wifi está habilitado
2. Wifi está deshabilitado

Primero de todo usted tiene que supervisar si el Internet está disponible o no, después de esto usted tendrá que agregar dos oyentes similares (Broadcast recievers) para el cambio del estado de Wifi y el estado móvil cambian y comprueban para el estado requerido, he agregado el método del cheque del estado abajo,

Implementación del receptor

Comprobación de cambios en un receptor y luego comprobación del estado

public class Internet_State extends BroadcastReceiver { //checked with new state changed when event occurs public boolean oldInternetState; @Override public void onReceive(Context context, Intent intent) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); Bundle b = intent.getExtras(); // if Internet available boolean isConnected = !b .getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY); // ignore if no state change if (oldInternetState == isConnected) return; // set new oldInternetState oldInternetState = isConnected; boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) .isAvailable(); //you can save these states to be monitored in wifi and mobile change change listners //No internet is 0 state int state = isConnected?1:0; if(state) state = checkState(context) intent.putExtra("state", state); // and then send this intent to your required method which will // check the state and perform function } @Override public void initialize(Context context) { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); //save the current internet state at start of the receiver registration oldInternetState = false; if (activeNetwork != null) oldInternetState = activeNetwork.isConnectedOrConnecting(); } } 

Implementar dos, móviles y wifi cambio de estado recievers y mejor agregar un método de verificación estatal como este

Estado de cheques

Control del estado de cuatro estados

 public int checkState(Context context){ ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) .isAvailable(); //No internet is 0 state int state = isConnected?1:0; if(isWifi && isMobile) state = 1; else if(isWifi && !isMobile) state = 2; if(isMobile && isWifi) state = 3; else if(isMobile && !isWifi) state = 4; return state; } 

Y llamar a este método de 3 Wifi, Internet y Mobile cambio de datos recievers, no se olvide de comprobar para oldState y coincidir con el estado cambiado.

Mobile old state por

  NetworkInfo allNetInfo = cm .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); oldDataState = allNetInfo.getState(); 

Para el estado Wifi

 int state = intent.getExtras().getInt(WifiManager.EXTRA_WIFI_STATE); if (state == WifiManager.WIFI_STATE_ENABLED) state = 1; else if (state == WifiManager.WIFI_STATE_DISABLED) state = 0; else return; if (state == oldWifiState) return; oldWifiState = state; 

Problema Tengo WiFi habilitado de 2 a 3 veces

Más de una llamada en el cambio de Wifi ocurren porque los estados cambiantes de Wifi, como TurningOn y TurningOf son accionados por OS, usted tiene que cancelar hacia fuera ellos, como hice arriba como

 if (state == WifiManager.WIFI_STATE_ENABLED) state = 1; else if (state == WifiManager.WIFI_STATE_DISABLED) state = 0; else return; 

Sólo se activan y desactivan ahora.

  Please find the below code. I suppose it is what you want. In case I misunderstood you, then please let me know: public void checkWifiMobileNetwork(Context context){ ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); if (activeNetwork != null && activeNetwork.isConnected()) { android.net.NetworkInfo connWifiType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); android.net.NetworkInfo connMobileType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if(connWifiType.isConnectedOrConnecting()){ Log.d("NETWORK_STATUS","WIFI_IS_THERE"); }else{ Log.d("NETWORK_STATUS","WIFI_IS_NOT_THERE"); } if(connMobileType.isConnectedOrConnecting()){ Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_THERE"); }else{ Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_NOT_THERE"); } }else { //notify user you are not online Log.d("NETWORK_STATUS","WIFI_MOBILE_IS_NOT_THERE"); } } Set permission at Manifest: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 

Puede intentar registrar un receptor de difusión para notar el cambio de red. Vea: http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html .

Tenga cuidado, el estado puede cambiar demasiadas veces y cada vez que su transmisión será desencadenada.

Pruebe este código en su primera actividad en la aplicación.

 public class YourActivity extends Activity { Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; this.registerReceiver(this.mNetworkConReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); // Here you register your receiver } private BroadcastReceiver mNetworkConReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager conMngr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if(wifi.isConnected()){ // Wifi is connected }else if(mobile.isConnected() && wifi.isConnected()){ // Mobile Network and Wifi is connected }// Others conditions here... } }; } 

Recuerde: Su receptor de difusión será activado por el cambio de estado de la red de Android cada vez.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.