2012-02-14 27 views
54

Tôi có chỉ báo trên ứng dụng của mình để hiển thị loại mạng (2G hoặc 3G hoặc 4G) nhưng sau khi nhận được loại mạng, làm cách nào để biết loại tốc độ nào ở trong?Cách xác định xem loại mạng là 2G, 3G hoặc 4G

tôi biết làm thế nào để phát hiện các loại mạng:

private TelephonyManager telephonyManager; 
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
CurrentNetworkType = telephonyManager.getNetworkType(); 

Với giá trị trả về có thể:

// public static final int NETWORK_TYPE_1xRTT 
// Since: API Level 4 
// Current network is 1xRTT 
// Constant Value: 7 (0x00000007) 
// 
// public static final int NETWORK_TYPE_CDMA 
// Since: API Level 4 
// Current network is CDMA: Either IS95A or IS95B 
// Constant Value: 4 (0x00000004) 
// 
// public static final int NETWORK_TYPE_EDGE 
// Since: API Level 1 
// Current network is EDGE 
// Constant Value: 2 (0x00000002) 
// 
// public static final int NETWORK_TYPE_EHRPD 
// Since: API Level 11 
// Current network is eHRPD 
// Constant Value: 14 (0x0000000e) 
// 
// public static final int NETWORK_TYPE_EVDO_0 
// Since: API Level 4 
// Current network is EVDO revision 0 
// Constant Value: 5 (0x00000005) 
// 
// public static final int NETWORK_TYPE_EVDO_A 
// Since: API Level 4 
// Current network is EVDO revision A 
// Constant Value: 6 (0x00000006) 
// 
// public static final int NETWORK_TYPE_EVDO_B 
// Since: API Level 9 
// Current network is EVDO revision B 
// Constant Value: 12 (0x0000000c) 
// 
// public static final int NETWORK_TYPE_GPRS 
// Since: API Level 1 
// Current network is GPRS 
// Constant Value: 1 (0x00000001) 
// 
// public static final int NETWORK_TYPE_HSDPA 
// Since: API Level 5 
// Current network is HSDPA 
// Constant Value: 8 (0x00000008) 
// 
// public static final int NETWORK_TYPE_HSPA 
// Since: API Level 5 
// Current network is HSPA 
// Constant Value: 10 (0x0000000a) 
// 
// public static final int NETWORK_TYPE_HSPAP 
// Since: API Level 13 
// Current network is HSPA+ 
// Constant Value: 15 (0x0000000f) 
// 
// public static final int NETWORK_TYPE_HSUPA 
// Since: API Level 5 
// Current network is HSUPA 
// Constant Value: 9 (0x00000009) 
// 
// public static final int NETWORK_TYPE_IDEN 
// Since: API Level 8 
// Current network is iDen 
// Constant Value: 11 (0x0000000b) 
// 
// public static final int NETWORK_TYPE_LTE 
// Since: API Level 11 
// Current network is LTE 
// Constant Value: 13 (0x0000000d) 
// 
// public static final int NETWORK_TYPE_UMTS 
// Since: API Level 1 
// Current network is UMTS 
// Constant Value: 3 (0x00000003) 
// 
// public static final int NETWORK_TYPE_UNKNOWN 
// Since: API Level 1 
// Network type is unknown 
// Constant Value: 0 (0x00000000) 

tôi sẽ xem xét LTE là 4G, nhưng mà trong số này đang thực sự coi 3G? Bất cứ điều gì khác tôi sẽ xem xét 2G.

Vậy bạn sẽ vẽ đường dây giữa 3G hoặc 3G ở đâu?

Cập nhật: Tôi tìm thấy câu trả lời có liên quan khác tại https://stackoverflow.com/a/8548926/949577 Sử dụng ConnectivityManager() để nhận loại và loại phụ rồi phân loại loại phụ nhanh hay không. Tôi không biết nếu sử dụng ConnectivityManager() là một cách tiếp cận tốt hơn sau đó sử dụng TelephonyManager() vì cả hai đều xuất hiện có thể trả về loại mạng.

Ngoài ra tôi tìm thấy một liên kết so sánh các tiêu chuẩn dữ liệu không dây tại http://en.wikipedia.org/wiki/Comparison_of_wireless_data_standards.

+0

có thể trùng lặp của [Phát hiện loại kết nối mạng trên Android] (http://stackoverflow.com/questions/2802472/detect-network-connection-type-on-android) – ben75

Trả lời

1

Tôi nghĩ rằng thực sự bạn chỉ cần hardcode giá trị tương đương mà bạn muốn họ có. Một googling nhanh chóng của hầu hết các công nghệ đó sẽ cung cấp cho bạn một số cách thức của một ý tưởng được coi là 3G hoặc 4G (mặc dù về mặt kỹ thuật không ai trong số họ là 4G thực). Vì dường như không có sự phân biệt giữa HSPA và HSPA +, bạn có thể muốn chạy một số loại kiểm tra tốc độ hoặc độ trễ và đi theo cách đó.

9

Bạn có thể sử dụng getSubtype() để biết thêm chi tiết.

int netType = info.getType(); 
int netSubtype = info.getSubtype(); 
if (netType == ConnectivityManager.TYPE_WIFI) { 
    return info.isConnected(); 
} else if (netType == ConnectivityManager.TYPE_MOBILE 
    && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS 
    && !mTelephony.isNetworkRoaming()) { 
     return info.isConnected(); 
} else { 
    return false; 
} 
+1

Sẽ thật tuyệt vời khi biết loại "thông tin" nào có;) ConnectivityManager cm = (ConnectivityManager) context.getSystemService (Context.CONNECTIVITY_SERVICE); Thông tin mạngInfo = cm.getActiveNetworkInfo(); –

65

Dựa trên những tài liệu cho nhà phát triển Android & liên kết Wikipedia ý kiến ​​ở đây tôi đã trao & xác định mạng type.Check các liên kết trong nhận xét.

Bạn có thể sử dụng getNetworkType để nhận loại Mạng.

 public class CommonUtils { 

    /** 
    * To get device consuming netowkr type is 2g,3g,4g 
    * 
    * @param context 
    * @return "2g","3g","4g" as a String based on the network type 
    */ 
    public static String getNetworkType(Context context) { 
     TelephonyManager mTelephonyManager = (TelephonyManager) 
       context.getSystemService(Context.TELEPHONY_SERVICE); 
     int networkType = mTelephonyManager.getNetworkType(); 
     switch (networkType) { 
      case TelephonyManager.NETWORK_TYPE_GPRS: 
      case TelephonyManager.NETWORK_TYPE_EDGE: 
      case TelephonyManager.NETWORK_TYPE_CDMA: 
      case TelephonyManager.NETWORK_TYPE_1xRTT: 
      case TelephonyManager.NETWORK_TYPE_IDEN: 
       return "2g"; 
      case TelephonyManager.NETWORK_TYPE_UMTS: 
      case TelephonyManager.NETWORK_TYPE_EVDO_0: 
      case TelephonyManager.NETWORK_TYPE_EVDO_A: 
       /** 
       From this link https://en.wikipedia.org/wiki/Evolution-Data_Optimized ..NETWORK_TYPE_EVDO_0 & NETWORK_TYPE_EVDO_A 
       EV-DO is an evolution of the CDMA2000 (IS-2000) standard that supports high data rates. 

       Where CDMA2000 https://en.wikipedia.org/wiki/CDMA2000 .CDMA2000 is a family of 3G[1] mobile technology standards for sending voice, 
       data, and signaling data between mobile phones and cell sites. 
       */ 
      case TelephonyManager.NETWORK_TYPE_HSDPA: 
      case TelephonyManager.NETWORK_TYPE_HSUPA: 
      case TelephonyManager.NETWORK_TYPE_HSPA: 
      case TelephonyManager.NETWORK_TYPE_EVDO_B: 
      case TelephonyManager.NETWORK_TYPE_EHRPD: 
      case TelephonyManager.NETWORK_TYPE_HSPAP: 
       //Log.d("Type", "3g"); 
       //For 3g HSDPA , HSPAP(HSPA+) are main networktype which are under 3g Network 
       //But from other constants also it will 3g like HSPA,HSDPA etc which are in 3g case. 
       //Some cases are added after testing(real) in device with 3g enable data 
       //and speed also matters to decide 3g network type 
       //https://en.wikipedia.org/wiki/4G#Data_rate_comparison 
       return "3g"; 
      case TelephonyManager.NETWORK_TYPE_LTE: 
       //No specification for the 4g but from wiki 
       //I found(LTE (Long-Term Evolution, commonly marketed as 4G LTE)) 
       //https://en.wikipedia.org/wiki/LTE_(telecommunication) 
       return "4g"; 
      default: 
       return "Notfound"; 
     } 
    } 

    /** 
    * To check device has internet 
    * 
    * @param context 
    * @return boolean as per status 
    */ 
    public static boolean isNetworkConnected(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     return netInfo != null && netInfo.isConnected(); 
    } 
} 
+0

nếu tôi kết nối với wifi nếu tôi chạy ứng dụng này, tôi có thể giải quyết – skyshine

+0

@ user1140237: Đối với ứng dụng của tôi, tôi yêu cầu kết nối internet liên tục, tôi đang sử dụng dịch vụ để phát hiện xem internet có được bật hay không. sau đó bật internet. Đôi khi tôi phải đối mặt với tình huống trong đó kết nối dữ liệu sẽ được bật lại lâu, nhưng do một số vấn đề, biểu tượng internet (H, E, v.v.) được hiển thị trên biểu tượng cường độ tín hiệu (trong thông báo) trở thành vắng mặt. Trong bối cảnh này, nơi internet được hiển thị như trên NHƯNG biểu tượng internet vắng mặt, nếu tôi sử dụng đoạn mã trên của bạn thì nó có thể phát hiện nếu biểu tượng có mặt hay không? – Basher51

+0

@ Basher51 để kiểm tra thiết bị có kết nối internet hay không bạn có thể sử dụng CONNECTIVITY_ACTION https://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION ... và ở đó bạn có thể kiểm tra xem internet có được kết nối không là 2g/3g? hy vọng tôi hve hiểu vấn đề ur ... nếu muốn hỏi thêm câu hỏi riêng biệt cho vấn đề tht .. – user1140237

91

Bạn có thể đặt phương pháp sau này trực tiếp trong lớp Utility của bạn:

public String getNetworkClass(Context context) { 
    TelephonyManager mTelephonyManager = (TelephonyManager) 
      context.getSystemService(Context.TELEPHONY_SERVICE); 
    int networkType = mTelephonyManager.getNetworkType(); 
    switch (networkType) { 
     case TelephonyManager.NETWORK_TYPE_GPRS: 
     case TelephonyManager.NETWORK_TYPE_EDGE: 
     case TelephonyManager.NETWORK_TYPE_CDMA: 
     case TelephonyManager.NETWORK_TYPE_1xRTT: 
     case TelephonyManager.NETWORK_TYPE_IDEN: 
      return "2G"; 
     case TelephonyManager.NETWORK_TYPE_UMTS: 
     case TelephonyManager.NETWORK_TYPE_EVDO_0: 
     case TelephonyManager.NETWORK_TYPE_EVDO_A: 
     case TelephonyManager.NETWORK_TYPE_HSDPA: 
     case TelephonyManager.NETWORK_TYPE_HSUPA: 
     case TelephonyManager.NETWORK_TYPE_HSPA: 
     case TelephonyManager.NETWORK_TYPE_EVDO_B: 
     case TelephonyManager.NETWORK_TYPE_EHRPD: 
     case TelephonyManager.NETWORK_TYPE_HSPAP: 
      return "3G"; 
     case TelephonyManager.NETWORK_TYPE_LTE: 
      return "4G"; 
     default: 
      return "Unknown"; 
    } 
} 

Nhờ sự hỗ trợ từ các mã nguồn Android. =]

+1

u có thể giúp tôi, làm thế nào để sử dụng mã này trong sim kép cho phép điện thoại di động? – harikrishnan

+0

lol ... câu hỏi hay hahah –

3

Nói kỹ thuật 1xRTT là công nghệ 3G (mặc dù nhiều người coi nó là 2G chỉ dựa trên tốc độ dữ liệu). Ngoài ra, bạn sẽ muốn thêm WiMax vào báo cáo chuyển đổi của mình để trả lại 4G. Nó không được sử dụng thường xuyên nữa, nhưng mạng WiMax của Sprint vẫn hoạt động trong thời gian này.

+1

Reg. 1xRTT, từ đâu có thông tin đó? Vui lòng cung cấp liên kết. Bạn cũng có nghĩa là IWLAN cho WiMax? – not2qubit

Các vấn đề liên quan