2010-05-27 22 views
8

Tôi đã cố gắng để truy xuất các loại mạng hiện tại, nhưng không thành côngNhận Mạng loại

khi tôi nói loại mạng: i tham khảo để biết thông tin này: nếu gõ là: NETWORK_TYPE_IDEN hoặc NETWORK_TYPE_UMTS .. và vv ..

tôi đã cố gắng để sử dụng:

NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

hoặc

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

nhưng không thành công ..

tôi đang làm điều này coz i muốn biết nếu mạng hiện nay là IDEN, hoặc nếu mạng hiện tại được kết nối qua wifi ..

+0

Bạn có thể chọn câu trả lời sau? Vì vậy, mọi người tiếp cận với chủ đề này có thể biết câu trả lời được chấp nhận. –

Trả lời

14

Để có được loại mạng (Tôi nghĩ rằng nói chuyện của bạn về wifi hoặc điện thoại di động), bạn có thể sử dụng đoạn mã này:

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

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

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

và sau đó sử dụng nó như thế:

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

Để có được loại mạng di động tôi sẽ thử TelephonyManager#getNetworkType hoặc NetworkInfo#getSubtypeName

+0

Có điều này đang kiểm tra thời tiết i'am trên wifi hay không .. và nó hoạt động! nhưng cũng có cách kiểm tra loại mạng của tôi không? (Ví dụ: tôi đang sử dụng IDEN/GSM ..) ? – Moshik

+0

i editet ansewr của tôi – RoflcoptrException

+0

Nó didnt làm việc sau khi tôi đã thử nó với Wifi ... nó vẫn còn eneter vào condisiton đầu tiên .. có vẻ như NetworkInfo.State.CONNECTED luôn luôn trở lại đúng .. bất kỳ ý tưởng? – Moshik

15

này làm việc cho tôi để kiểm tra các loại mạng ...

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

Tôi đang sử dụng chức năng này:

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

Ngoài ra, thêm vào dưới đây cho phép yêu cầu trong AndroidManifest của bạn. xml.

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

Nếu không, bạn sẽ phải đối mặt với vụ tai nạn ứng dụng trong khi nhận được ConnectivityManager xử lý do ngoại lệ an ninh.

1

Theo kinh nghiệm của tôi ... tốt nhất là sử dụng hướng dẫn đào tạo Android cho các loại nỗ lực này. Thật dễ dàng để có được ngoại lệ con trỏ null khi bạn sử dụng các lớp này, và nó đặc biệt xấu khi bạn cố gắng phát hiện các kết nối này khi ứng dụng đầu tiên mở ra và sau đó ứng dụng gặp sự cố.

Bạn có thể sử dụng ConnectivityManager để kiểm tra rằng bạn đang thực sự kết nối với Internet, và nếu như vậy, loại kết nối được đặt ra:

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

Bạn có thể sử dụng để xác định ConnectivityManager hoạt động phát thanh không dây:

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

14

tôi ghét con số ma thuật:

/** 
* 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 là sự cố; Tôi thích 'default: return" Không biết kiểu mới ";'. Kể từ hôm nay, mã chứa danh sách đầy đủ các hằng số NETWORK_TYPE_xxx. – 18446744073709551615

+0

@ 18446744073709551615: Vâng vâng - người ta nên có một ngoại lệ kiểm tra tùy chỉnh có thể - những gì tôi có nghĩa là để nói với RE là nó không nên xảy ra - thư viện nên chăm sóc nó với 'NETWORK_TYPE_UNKNOWN' (bằng tên của nó). –

+0

** OFF-TOPIC ** đó là một câu hỏi triết lý thú vị: giá trị nào nên _getNetworkType() _ trả lại khi một loại mạng mới (nói, NETWORK_TYPE_XYZ) xuất hiện và điện thoại đăng ký trong một mạng như vậy? Nếu nó trả về NETWORK_TYPE_XYZ, các ứng dụng cũ có thể bị lỗi (giống như 'throw new RuntimeException()' ở trên). Nếu họ kiểm tra tệp kê khai ứng dụng và trả lại NETWORK_TYPE_UNKNOWN cho các ứng dụng được xây dựng dựa trên các phiên bản SDK cũ hơn, nhà phát triển có thể sẽ phát điên khi tìm hiểu lý do ứng dụng cũ không thấy loại mạng mới. – 18446744073709551615

2

câu trả lời tốt nhất

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; 

Danh sách networkType cung cấp.

0

sử dụng tốt hơn sẽ là:

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; 

những loại khác mà bạn muốn xác định và xử lý là tùy thuộc vào bạn ...

Đối với những người muốn một định danh chuỗi, sử dụng tốt hơn:

activeNetworkInfo.getTypeName() 
activeNetworkInfo.getSubtypeName()