Comprobando la conexión a internet en android

Tengo el siguiente código para verificar la conexión a internet wifi / EDGE / GPRS / 3G en mi aplicación.

el código es

public static boolean checkConn(Context ctx) { ConnectivityManager conMgr = (ConnectivityManager) ctx .getSystemService(Context.CONNECTIVITY_SERVICE); if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING) { return true; } else if (conMgr.getNetworkInfo(0).getState()==NetworkInfo.State.DISCONNECTED || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED){ return false; } return false; } 

y lo estoy llamando como a continuación:

 if (CheckInternet.checkConn(introPage.this) == true) { Intent toMainPage = new Intent(introPage.this, mainPage.class); System.gc(); startActivity(toMainPage); } else if (CheckInternet.checkConn(getApplicationContext()) == false) { Toast.makeText(getApplicationContext(), "Sorry, No internet connectivity found", Toast.LENGTH_SHORT) .show(); } 

Pero estoy teniendo un problema, que es que si estoy conectado a wifi, y abro la aplicación, funciona bien, pero si cierro la aplicación y apago wifi y vuelvo a abrir la aplicación, no ocurre por el error de “sin conexión”, necesito apagar mi dispositivo y luego encenderlo, y el mismo caso es si el wifi está apagado, y abro la aplicación, arroja un error de “sin conexión”, y si lo enciendo, aún así arroja el mismo error de “sin conexión”, hasta que apague y encienda el dispositivo.

A veces, la conexión activa no está primero en la lista, o está inactiva o en un estado de error. Así es como lo haría:

  NetworkInfo i = conMgr.getActiveNetworkInfo(); if (i == null) return false; if (!i.isConnected()) return false; if (!i.isAvailable()) return false; return true; 

[EDIT 1] No olvides agregar este permiso en el manifiesto de la aplicación:

   

¿Esto te ayuda?

Emmanuel

La respuesta corta:

 public boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager)getActivity().getApplicationContext() .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null; } 

Es mejor:

 if (conMgr != null) { NetworkInfo i = conMgr.getActiveNetworkInfo(); if (i != null) { if (!i.isConnected()) ret = false; if (!i.isAvailable()) ret = false; } if (i == null) ret = false; } else ret = false; 

con la otra forma, si “Red i” es igual a cero entonces, verifique después de !i.isConnected() debe fallar (i es nulo).

 public static boolean checkNetworkStatus(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); TelephonyManager telephony = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); NetworkStatus netStatus = new NetworkStatus(connectivity, telephony); if (netStatus.isNetworkAvailable() == true) { Log.e(" in checkNetworkStatus()", "network available"); return true; } else { Log.e(" in checkNetworkStatus()", "no network"); return false; } } 

Wifi-


 void chkStatus() { final ConnectivityManager connMgr = (ConnectivityManager) this .getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo wifi = connMgr .getNetworkInfo(ConnectivityManager.TYPE_WIFI); final android.net.NetworkInfo mobile = connMgr .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wifi.isAvailable()) { Toast.makeText(this, "Wifi", Toast.LENGTH_LONG).show(); } else if (mobile.isAvailable()) { Toast.makeText(this, "Mobile 3G ", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "No Network ", Toast.LENGTH_LONG).show(); } } 

Prueba esto:

 public boolean isInternetAvailable(Context context) { ConnectivityManager conMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo i = conMgr.getActiveNetworkInfo(); if (i == null) return false; if (!i.isConnected()) return false; if (!i.isAvailable()) return false; return true; } 

y este permiso:

Hola, intente el siguiente código:

  public class NetworkCheckDemo extends Activity { TextView tvstatus; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tvstatus=(TextView)findViewById(R.id.txtviewstatus); ConnectivityManager cn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo nf=cn.getActiveNetworkInfo(); if(nf != null && nf.isConnected()==true ) { Toast.makeText(this, "Network Available", Toast.LENGTH_LONG).show(); tvstatus.setText("Network Available"); } else { Toast.makeText(this, "Network Not Available", Toast.LENGTH_LONG).show(); tvstatus.setText("Network Not Available"); } } } 

Agregue a continuación 3 permisos en el archivo de manifiesto de Android.

     

Solía ​​comprobar si tengo conectividad, no olvide verificar si NetworkInfo es nulo o no, porque en la tableta donde no se proporciona conectividad de datos móviles, NetworkInfo para TYPE_MOBILE devuelve nulo.

 public static boolean collectionAllowed(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mobileInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_MOBILE); State mobile = NetworkInfo.State.DISCONNECTED; if ( mobileInfo != null) { mobile = mobileInfo.getState(); } NetworkInfo wifiInfo = connectivityManager.getNetworkInfo( ConnectivityManager.TYPE_WIFI); State wifi = NetworkInfo.State.DISCONNECTED; if ( wifiInfo != null) { wifi = wifiInfo.getState(); } boolean dataOnWifiOnly = (Boolean) PreferenceManager .getDefaultSharedPreferences(context).getBoolean( "data_wifi_only", true); if ((!dataOnWifiOnly && (mobile.equals(NetworkInfo.State.CONNECTED) || wifi .equals(NetworkInfo.State.CONNECTED))) || (dataOnWifiOnly && wifi.equals(NetworkInfo.State.CONNECTED))) { return true; } else { return false; } } 

lo mismo que la respuesta aprobada, pero en resumen:

 public static boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); return info != null && info.isConnected() && info.isAvailable(); } 

Puedes usar esta increíble esencia de emil2k :

 import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.telephony.TelephonyManager; public class Connectivity { public static NetworkInfo getNetworkInfo(Context context){ ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo(); } public static boolean isConnected(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected()); } public static boolean isConnectedWifi(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); } public static boolean isConnectedMobile(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE); } public static boolean isConnectedFast(Context context){ NetworkInfo info = Connectivity.getNetworkInfo(context); return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype())); } public static boolean isConnectionFast(int type, int subType){ if(type==ConnectivityManager.TYPE_WIFI){ return true; }else if(type==ConnectivityManager.TYPE_MOBILE){ switch(subType){ case TelephonyManager.NETWORK_TYPE_1xRTT: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_CDMA: return false; // ~ 14-64 kbps case TelephonyManager.NETWORK_TYPE_EDGE: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_EVDO_0: return true; // ~ 400-1000 kbps case TelephonyManager.NETWORK_TYPE_EVDO_A: return true; // ~ 600-1400 kbps case TelephonyManager.NETWORK_TYPE_GPRS: return false; // ~ 100 kbps case TelephonyManager.NETWORK_TYPE_HSDPA: return true; // ~ 2-14 Mbps case TelephonyManager.NETWORK_TYPE_HSPA: return true; // ~ 700-1700 kbps case TelephonyManager.NETWORK_TYPE_HSUPA: return true; // ~ 1-23 Mbps case TelephonyManager.NETWORK_TYPE_UMTS: return true; // ~ 400-7000 kbps /* * Above API level 7, make sure to set android:targetSdkVersion * to appropriate level to use these */ case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 return true; // ~ 1-2 Mbps case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 return true; // ~ 5 Mbps case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 return true; // ~ 10-20 Mbps case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 return false; // ~25 kbps case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 return true; // ~ 10+ Mbps // Unknown case TelephonyManager.NETWORK_TYPE_UNKNOWN: default: return false; } }else{ return false; } } }