2011-06-22 8 views
14

Jaki jest poprawny sposób sprawdzenia, czy połączenie z siecią komórkową (GSM) jest dostępne w systemie Android? (> 2.1) Nie chcę sprawdzać, czy jest dostępne połączenie danych przez sieć komórkową, tylko sprawdź ogólnie dostępność sieci. (Sprawdzić, czy możliwe są rozmowy telefoniczne przez sieć komórkową)Jaki jest prawidłowy sposób sprawdzenia dostępności sieci komórkowej (brak połączenia danych)?

w tej chwili używam następujący czek:

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

Ale wydaje się, że niektóre urządzenia zawsze zgłoś się „NETWORK_TYPE_UNKNOWN”. Więc czek nie udaje się cały czas.

Czy jest lepsze podejście do robienia tego?

Aktualizacja:

Czy następujące podejście jest lepsze?

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

Odpowiedz

1

Popatrz na moją odpowiedź na Problem in detecting Internet Connection in Android.

Możesz uzyskać odpowiedź NETWORK_TYPE_UNKNOWN, jeśli sieć jest niedostępna lub nadal łączy się.

+0

Mmh. Mój problem polega na tym, że nie chcę sprawdzać dostępności danych. Podczas korzystania z metody ConnectivityManager getActiveNetworkInfo() otrzymuję aktywną sieć danych. To nie są informacje, które chciałbym uzyskać. Chcę tylko wiedzieć, czy mam połączenie z siecią komórkową. (nie ma znaczenia, czy mam połączenie danych) –

+0

A może wystarczyłoby powtórzenie wszystkich dostępnych sieci i sprawdzenie mobilnego? –

4

Dla mnie działa dobrze PhoneStateListener:

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

i zarejestrować w TelephonyManager:

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

Przy rejestracji kierownik telefonii wywołuje metodę onServiceChanged() na obiekcie słuchacza i przekazuje aktualny stan.

PS: PhoneStateListener używa Handler do opublikowania wyniku w wątku UI, więc powinieneś go utworzyć w wątku UI.

7

Użyłem poniższy kod, żeby wiedzieć, czy jestem podłączony do sieci mobilnych (brak danych):

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

NetworkOperator zwracany jest tylko wtedy, gdy telefon jest rzeczywiście zarejestrowany w sieci.

+0

Czy chciałeś użyć || operator zamiast && czy jestem po prostu zdezorientowany? –

+0

To działało dla mnie. Dzięki – Seenu69

2

Korzystam z następującej metody, aby sprawdzić dostępność połączenia sieciowego w systemie Android. Najlepszą rzeczą jest to, że możesz skopiować tę samą metodę i użyć jej do sprawdzenia połączenia sieciowego. Sprawdza łączność wszystkich sieci, aby upewnić się, że którakolwiek z sieci jest podłączona.

/** 
* 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

wierzę, że to zrobi pracy ..

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (manager != null) { 
      NetworkInfo info = manager.getActiveNetworkInfo(); 
      if (info != null && info.isConnected()) { 
       networkAvailable = true; 
      } 
Powiązane problemy