¿Cuál es la forma correcta de comprobar la disponibilidad de la red móvil (sin conexión de datos)

¿Cuál es la forma correcta de comprobar si una conexión de red móvil (GSM) está disponible en Android? (> 2.1) No quiero comprobar si hay conexión de datos disponible a través de la red móvil, solo comprueba la disponibilidad de la red en general. (Compruebe si son posibles las llamadas telefónicas a través de la red móvil)

En este momento estoy usando el siguiente cheque:

public static boolean checkMobileNetworkAvailable(Context context){ TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); int networkType = tm.getNetworkType(); return (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN); } 

Pero parece que algunos dispositivos siempre informan de nuevo "NETWORK_TYPE_UNKNOWN". Así que el cheque falla todo el tiempo.

¿Hay un mejor enfoque para hacerlo?

Actualizar:

¿Sería mejor el siguiente enfoque?

  public static boolean checkMobileNetworkAvailable(Context context){ boolean isMobileNetworkAvailable = false; ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] networks = cm.getAllNetworkInfo(); for(int i=0;i<networks.length;i++){ if(networks[i].getType() == ConnectivityManager.TYPE_MOBILE){ if(networks[i].isAvailable()){ isMobileNetworkAvailable = true; } } } return isMobileNetworkAvailable; } 

He utilizado el siguiente código para saber si estoy conectado a la red (no hay datos móviles):

  public static Boolean isMobileAvailable(Context appcontext) { TelephonyManager tel = (TelephonyManager) appcontext.getSystemService(Context.TELEPHONY_SERVICE); return ((tel.getNetworkOperator() != null && tel.getNetworkOperator().equals("")) ? false : true); } 

El NetworkOperator sólo se devuelve si el teléfono está realmente registrado en una red.

Para mí funciona bien PhoneStateListener:

 private static class YourListener extends PhoneStateListener { @Override public void onServiceStateChanged(ServiceState serviceState){ if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) { // connected to cellular network } } } 

Y regístrese en TelephonyManager:

 TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); YourListener listener = new YourListener(); tm.listen(listener, PhoneStateListener.LISTEN_SERVICE_STATE); 

En el registro, el administrador de telefonía invoca el método onServiceChanged () en el objeto de escucha y pasa el estado actual.

PS: PhoneStateListener utiliza Handler para publicar el resultado en el subproceso de la interfaz de usuario, por lo que debe crearlo en el subproceso de la interfaz de usuario.

Estoy utilizando el siguiente método para comprobar la disponibilidad de la conexión de red en android. Lo mejor es que puede copiar este método tal como está y puede utilizarlo para comprobar la conectividad de red. Comprueba la conectividad de todas las redes para garantizar si cualquiera de la red está conectada o no.

 /** * Check the hardware if there are connected to Internet or not. * This method gets the list of all available networks and if any one of * them is connected returns true. If none is connected returns false. * * @param context {@link Context} of the app. * @return <code>true</code> if connected or <code>false</code> if not */ public static boolean isNetworkAvailable(Context context) { boolean available = false; try { ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { available = true; } } } } if (available == false) { NetworkInfo wiMax = connectivity.getNetworkInfo(6); if (wiMax != null && wiMax.isConnected()) { available = true; } } } catch (Exception e) { e.printStackTrace(); } return available; } 

Mira mi respuesta al problema en la detección de conexión a Internet en Android .

Puede obtener la respuesta NETWORK_TYPE_UNKNOWN si la red no está disponible o aún se está conectando.

Creo que esto hará el trabajo ..

 ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (manager != null) { NetworkInfo info = manager.getActiveNetworkInfo(); if (info != null && info.isConnected()) { networkAvailable = true; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.