2010-11-03 26 views
22

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

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 yo 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, y ​​es que si estoy conectado a Wi-Fi, y abro la aplicación, funciona bien, pero si cierro la aplicación y apago wifi y vuelvo a abrir la aplicación, no pasa por el error de "sin conexión", necesito apagar mi dispositivo y luego encenderlo, y el mismo estuche si el wifi está desactivado, y abro la aplicación, arroja un error de "sin conexión", y si lo enciendo, todavía lo arrojo s el mismo error de "sin conexión", hasta que apague y encienda el dispositivo.

+0

cerca la aplicación presionando el hogar o llave .. Coz si u cerrar pulsando a continuación HME aplicación estará en segundo plano y no lo hará alcrear ser despedido – DeRagan

+0

@Rahul, pero ¿por qué incluso encender el wifi, todavía no da problemas de conexión? – kaibuki

+0

No estoy seguro de cómo está llamando a esta línea de código ... Si solo está buscando esta condición en las actividades de creación, se llamará solo una vez ... – DeRagan

Respuesta

68

A veces, la conexión activa no está primero en la lista, o está inactiva o en un estado de error. Esta es la forma en que 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 se olvide de agregar este permiso en el manifiesto de aplicación:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

¿Le ayuda esto?

Emmanuel

+0

que estaba buscando para el control de internet conexión en Android y encontró su respuesta. Se ve simple y agradable. ¿Pero también verifica 3G? Gracias. – lomza

+2

Debe verificar el tipo de red para esto. i.getType() == ConnectivityManager.TYPE_MOBILE e incluso puede obtener el subtipo. i.getSubType() == TelephonyManager.NETWORK_TYPE_ * – Emmanuel

+0

También puede usar ConnectivityManager ==> http://stackoverflow.com/a/4009133/186636 –

2

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 la "Red i" es igual nula entonces, después de comprobar para !i.isConnected() debe fallar (i es nula).

+0

¿Por qué no enfoque negro en lugar de enfoque blanco? –

+0

Usted está equivocado, en la otra forma "if (i == null)" "return" false, omita el resto de las comprobaciones.También en el otro sentido hay menos CC (menos anidación) – NicoGranelli

+0

'return' es mejor que usar 'else' ('else' da cáncer) – SparK

2
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(); 
    } 
} 
0

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

Añadir debajo de los 3 permisos de Android manifiesto de archivo.

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
+2

'CHANGE_NETWORK_STATE' no es necesario – njzk2

0

que se utiliza para comprobar si tengo conectividad, no se olvide de comprobar si el NetworkInfo es nulo o no, porque en la tableta, donde no se proporciona la conectividad de datos móviles, el NetworkInfo de nula rentabilidad TYPE_MOBILE.

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

La respuesta corta:

public boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager = (ConnectivityManager)getActivity().getApplicationContext() 
               .getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null; 
} 
1

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:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

0

misma 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(); 
} 
0

Puede utilizar este impresionante gist by 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; 
     } 
    } 

} 
Cuestiones relacionadas