2011-06-22 14 views
14

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

Por el momento estoy usando la siguiente comprobación:

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 informen "NETWORK_TYPE_UNKNOWN". Entonces el cheque falla todo el tiempo.

¿Hay un mejor enfoque para hacerlo?

Actualización:

¿Sería el siguiente enfoque mejor?

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

Respuesta

1

Mira mi respuesta al Problem in detecting Internet Connection in Android.

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

+0

Mmh. Mi problema es que no quiero verificar la disponibilidad de los datos. Cuando uso el método ConnectivityManager getActiveNetworkInfo() obtengo la red de datos activa. Esa no es la información que me gustaría obtener. Solo quiero saber si estoy conectado a la red móvil. (no importa si tengo una conexión de datos) –

+0

¿O sería suficiente recorrer todas las redes disponibles y buscar una conexión móvil? –

4

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 registro en TelephonyManager:

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

En el registro del gestor de la telefonía invoca el método onServiceChanged() en el objeto detector y pasa al estado actual.

PD: PhoneStateListener utiliza el controlador para publicar el resultado en el hilo de la interfaz de usuario, por lo que debe crearlo en el hilo de la interfaz de usuario.

7

que utiliza el código siguiente 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.

+0

¿Querías usar || operador en lugar de && o ¿estoy confundido? –

+0

Esto ha funcionado para mí. Gracias – Seenu69

2

Estoy utilizando el siguiente método para verificar la disponibilidad de la conexión de red en android. Lo mejor es que puede copiar este método tal como es y puede usarlo para verificar la conectividad de la red. Comprueba la conectividad de todas las redes para garantizar si alguna 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; 
} 
0

creo que esto va a hacer el trabajo ..

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (manager != null) { 
      NetworkInfo info = manager.getActiveNetworkInfo(); 
      if (info != null && info.isConnected()) { 
       networkAvailable = true; 
      } 
Cuestiones relacionadas