2010-05-27 20 views
8

Próbowałem przy sprowadzaniu bieżący typ sieci, ale bez powodzeniaGet typu Network

kiedy mówię typ sieci: Odnoszę znać te informacje: jeśli typ jest: NETWORK_TYPE_IDEN lub NETWORK_TYPE_UMTS .. i itd ..

próbowałem używać:

NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

lub

NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo 
      (ConnectivityManager.TYPE_MOBILE); 

ale bez powodzenia ..

Robię to bo chcę wiedzieć, czy sieć jest obecna IDEN, lub jeśli prąd sieciowy jest podłączony przez wifi ..

+0

Czy można wybrać odpowiedź z następującego? Ludzie, którzy sięgają do tego wątku, mogą znać zaakceptowaną odpowiedź. –

Odpowiedz

14

Aby uzyskać typ sieci (myślę mówisz o wifi lub komórkowego) można użyć tego fragmentu kodu:

ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

//mobile 
State mobile = conMan.getNetworkInfo(0).getState(); 

//wifi 
State wifi = conMan.getNetworkInfo(1).getState(); 

a następnie używać go tak:

if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) { 
    //mobile 
} else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) { 
    //wifi 
} 

Aby uzyskać typ sieci komórkowej bym spróbuj TelephonyManager#getNetworkType lub NetworkInfo#getSubtypeName

+0

Tak, to jest sprawdzanie pogody w sieci Wi-Fi lub nie ... i to działa! ale czy istnieje również sposób sprawdzenia mojego typu sieci? (Na przykład jestem na IDEN/GSM ..) ? – Moshik

+0

i editet mój ansewr – RoflcoptrException

+0

Nie działa po wypróbowałem go z Wifi ... to nadal eneter w pierwszym condisiton .. wydaje się, że NetworkInfo.State.CONNECTED zawsze zwraca true .. jakiś pomysł? – Moshik

15

Działa to dla mnie sprawdzić typ sieci ...

TelephonyManager teleMan = 
      (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
int networkType = teleMan.getNetworkType(); 

switch (networkType) 
{ 
case 7: 
    textV1.setText("1xRTT"); 
    break;  
case 4: 
    textV1.setText("CDMA"); 
    break;  
case 2: 
    textV1.setText("EDGE"); 
    break; 
case 14: 
    textV1.setText("eHRPD"); 
    break;  
case 5: 
    textV1.setText("EVDO rev. 0"); 
    break; 
case 6: 
    textV1.setText("EVDO rev. A"); 
    break; 
case 12: 
    textV1.setText("EVDO rev. B"); 
    break; 
case 1: 
    textV1.setText("GPRS"); 
    break;  
case 8: 
    textV1.setText("HSDPA"); 
    break;  
case 10: 
    textV1.setText("HSPA"); 
    break;   
case 15: 
    textV1.setText("HSPA+"); 
    break;   
case 9: 
    textV1.setText("HSUPA"); 
    break;   
case 11: 
    textV1.setText("iDen"); 
    break; 
case 13: 
    textV1.setText("LTE"); 
    break; 
case 3: 
    textV1.setText("UMTS"); 
    break;   
case 0: 
    textV1.setText("Unknown"); 
    break; 
} 
7

używam tej funkcji:

public String get_network() 
     {Activity act=(Activity)context; 
     String network_type="UNKNOWN";//maybe usb reverse tethering 
     NetworkInfo active_network=((ConnectivityManager)act.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 
     if (active_network!=null && active_network.isConnectedOrConnecting()) 
      {if (active_network.getType()==ConnectivityManager.TYPE_WIFI) 
       {network_type="WIFI"; 
       } 
      else if (active_network.getType()==ConnectivityManager.TYPE_MOBILE) 
       {network_type=((ConnectivityManager)act.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo().getSubtypeName(); 
       } 
      } 
     return network_type; 
     } 
1

Również dodać poniżej wymaganego zezwolenia w swoim AndroidManifest. xml.

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

W przeciwnym razie będziesz musiał stawić czoła awarii aplikacji, podczas gdy coraz ConnectivityManager obsłużyć wyjątek ze względu na bezpieczeństwo.

1

Z mojego doświadczenia ... najlepiej jest korzystać z przewodników szkoleniowych z Androidem w przypadku tego typu działań. Łatwo jest uzyskać wyjątki wskaźnika pustego, gdy używasz tych klas, i jest to szczególnie złe, gdy próbujesz wykryć te połączenia, gdy aplikacja zostanie po raz pierwszy otwarta, a następnie aplikacja się zawiesi.

Można użyć ConnectivityManager aby sprawdzić, czy rzeczywiście jesteś podłączony do Internetu, a jeśli tak, to jaki rodzaj połączenia jest na swoim miejscu:

http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html

można użyć do określenia ConnectivityManager aktywna komunikacja bezprzewodowa:

http://developer.android.com/training/efficient-downloads/connectivity_patterns.html

14

nienawidzę magiczne numery:

/** 
* You need to add: 
* 
* <pre> 
*  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
* </pre> 
* 
* in your AndroidManifest.xml. 
*/ 
private String networkType() { 
    TelephonyManager teleMan = (TelephonyManager) 
      getSystemService(Context.TELEPHONY_SERVICE); 
    int networkType = teleMan.getNetworkType(); 
    switch (networkType) { 
     case TelephonyManager.NETWORK_TYPE_1xRTT: return "1xRTT"; 
     case TelephonyManager.NETWORK_TYPE_CDMA: return "CDMA"; 
     case TelephonyManager.NETWORK_TYPE_EDGE: return "EDGE"; 
     case TelephonyManager.NETWORK_TYPE_EHRPD: return "eHRPD"; 
     case TelephonyManager.NETWORK_TYPE_EVDO_0: return "EVDO rev. 0"; 
     case TelephonyManager.NETWORK_TYPE_EVDO_A: return "EVDO rev. A"; 
     case TelephonyManager.NETWORK_TYPE_EVDO_B: return "EVDO rev. B"; 
     case TelephonyManager.NETWORK_TYPE_GPRS: return "GPRS"; 
     case TelephonyManager.NETWORK_TYPE_HSDPA: return "HSDPA"; 
     case TelephonyManager.NETWORK_TYPE_HSPA: return "HSPA"; 
     case TelephonyManager.NETWORK_TYPE_HSPAP: return "HSPA+"; 
     case TelephonyManager.NETWORK_TYPE_HSUPA: return "HSUPA"; 
     case TelephonyManager.NETWORK_TYPE_IDEN: return "iDen"; 
     case TelephonyManager.NETWORK_TYPE_LTE: return "LTE"; 
     case TelephonyManager.NETWORK_TYPE_UMTS: return "UMTS"; 
     case TelephonyManager.NETWORK_TYPE_UNKNOWN: return "Unknown"; 
    } 
    throw new RuntimeException("New type of network"); 
} 
+0

RuntimeException jest awarią; Wolę 'default: return" Nieznany nowy typ ";'. Na dzień dzisiejszy kod zawiera pełną listę stałych NETWORK_TYPE_xxx. – 18446744073709551615

+0

@ 18446744073709551615: Cóż, tak - należy mieć niestandardowy sprawdzony wyjątek prawdopodobnie - co miałem na myśli z RE jest to, że nie powinno się zdarzyć - biblioteka powinna zająć się nim z 'NETWORK_TYPE_UNKNOWN' (przez jego nazwę). –

+0

** OFF-TOPIC ** to interesujące pytanie filozoficzne: jaką wartość powinien mieć _getNetworkType() _, gdy pojawi się nowy typ sieci (np. NETWORK_TYPE_XYZ), a telefon zarejestruje się w takiej sieci? Jeśli zwróci NETWORK_TYPE_XYZ, stare aplikacje mogą się zawiesić (dokładnie tak, jak robi to 'throw new RuntimeException()' powyżej). Jeśli sprawdzą manifest aplikacji i zwrócą NETWORK_TYPE_UNKNOWN dla aplikacji zbudowanych na starszych wersjach SDK, programiści prawdopodobnie oszaleją, próbując dowiedzieć się, dlaczego stara aplikacja nie widzi nowego rodzaju sieci. – 18446744073709551615

2

Najlepsza odpowiedź

public static String getNetworkType(Context context) { 

      TelephonyManager teleMan = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
      int networkType = teleMan.getNetworkType(); 
      switch (networkType) { 
       case TelephonyManager.NETWORK_TYPE_1xRTT: 
        return "1xRTT"; 
       case TelephonyManager.NETWORK_TYPE_CDMA: 
        return "CDMA"; 
       case TelephonyManager.NETWORK_TYPE_EDGE: 
        return "EDGE"; 
       case TelephonyManager.NETWORK_TYPE_EHRPD: 
        return "eHRPD"; 
       case TelephonyManager.NETWORK_TYPE_EVDO_0: 
        return "EVDO rev. 0"; 
       case TelephonyManager.NETWORK_TYPE_EVDO_A: 
        return "EVDO rev. A"; 
       case TelephonyManager.NETWORK_TYPE_EVDO_B: 
        return "EVDO rev. B"; 
       case TelephonyManager.NETWORK_TYPE_GPRS: 
        return "GPRS"; 
       case TelephonyManager.NETWORK_TYPE_HSDPA: 
        return "HSDPA"; 
       case TelephonyManager.NETWORK_TYPE_HSPA: 
        return "HSPA"; 
       case TelephonyManager.NETWORK_TYPE_HSPAP: 
        return "HSPA+"; 
       case TelephonyManager.NETWORK_TYPE_HSUPA: 
        return "HSUPA"; 
       case TelephonyManager.NETWORK_TYPE_IDEN: 
        return "iDen"; 
       case TelephonyManager.NETWORK_TYPE_LTE: 
        return "LTE"; 
       case TelephonyManager.NETWORK_TYPE_UMTS: 
        return "UMTS"; 
       case TelephonyManager.NETWORK_TYPE_UNKNOWN: 
        return "Unknown"; 
      } 
      return "New type of network"; 
    } 
2
/** Network type is unknown */ 
public static final int NETWORK_TYPE_UNKNOWN = 0; 
/** Current network is GPRS */ 
public static final int NETWORK_TYPE_GPRS = 1; 
/** Current network is EDGE */ 
public static final int NETWORK_TYPE_EDGE = 2; 
/** Current network is UMTS */ 
public static final int NETWORK_TYPE_UMTS = 3; 
/** Current network is CDMA: Either IS95A or IS95B*/ 
public static final int NETWORK_TYPE_CDMA = 4; 
/** Current network is EVDO revision 0*/ 
public static final int NETWORK_TYPE_EVDO_0 = 5; 
/** Current network is EVDO revision A*/ 
public static final int NETWORK_TYPE_EVDO_A = 6; 
/** Current network is 1xRTT*/ 
public static final int NETWORK_TYPE_1xRTT = 7; 
/** Current network is HSDPA */ 
public static final int NETWORK_TYPE_HSDPA = 8; 
/** Current network is HSUPA */ 
public static final int NETWORK_TYPE_HSUPA = 9; 
/** Current network is HSPA */ 
public static final int NETWORK_TYPE_HSPA = 10; 
/** Current network is iDen */ 
public static final int NETWORK_TYPE_IDEN = 11; 
/** Current network is EVDO revision B*/ 
public static final int NETWORK_TYPE_EVDO_B = 12; 
/** Current network is LTE */ 
public static final int NETWORK_TYPE_LTE = 13; 
/** Current network is eHRPD */ 
public static final int NETWORK_TYPE_EHRPD = 14; 
/** Current network is HSPA+ */ 
public static final int NETWORK_TYPE_HSPAP = 15; 
/** Current network is GSM {@hide} */ 
public static final int NETWORK_TYPE_GSM = 16; 
/** Current network is TD_SCDMA {@hide} */ 
public static final int NETWORK_TYPE_TD_SCDMA = 17; 
/** Current network is IWLAN {@hide} */ 
public static final int NETWORK_TYPE_IWLAN = 18; 

Lista networkType przewidziane.

0

Lepsze wykorzystanie byłoby:

NetworkInfo activeNetworkInfo = ((ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 
    if (activeNetworkInfo == null) return false; 
    switch (activeNetworkInfo.getType()) { 
     case ConnectivityManager.TYPE_WIFI: 
      return true; 
    } 
//  public static final int TYPE_BLUETOOTH = 7; 
//  public static final int TYPE_DUMMY = 8; 
//  public static final int TYPE_ETHERNET = 9; 
//  public static final int TYPE_MOBILE = 0; 
//  public static final int TYPE_MOBILE_DUN = 4; 
//  /** @deprecated */ 
//  @Deprecated 
//  public static final int TYPE_MOBILE_HIPRI = 5; 
//  /** @deprecated */ 
//  @Deprecated 
//  public static final int TYPE_MOBILE_MMS = 2; 
//  /** @deprecated */ 
//  @Deprecated 
//  public static final int TYPE_MOBILE_SUPL = 3; 
//  public static final int TYPE_VPN = 17; 
//  public static final int TYPE_WIFI = 1; 
//  public static final int TYPE_WIMAX = 6; 

Jakie inne rodzaje chcesz zdefiniować i uchwyt do ciebie ...

Dla chcących identyfikator ciąg, lepsze wykorzystanie:

activeNetworkInfo.getTypeName() 
activeNetworkInfo.getSubtypeName() 
Powiązane problemy