2011-06-22 54 views
14

Cách kiểm tra chính xác liệu kết nối mạng di động (GSM) có khả dụng trên Android không? (> 2.1) Tôi không muốn kiểm tra nếu có kết nối dữ liệu có sẵn trên mạng di động chỉ cần kiểm tra tính khả dụng của mạng nói chung. (Kiểm tra nếu cuộc gọi điện thoại qua mạng di động có thể xảy ra)Cách chính xác để kiểm tra mạng di động có sẵn (không có kết nối dữ liệu)

Hiện nay tôi đang sử dụng việc kiểm tra sau:

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

Nhưng có vẻ như một số thiết bị luôn báo cáo lại "NETWORK_TYPE_UNKNOWN". Vì vậy, kiểm tra thất bại tất cả các thời gian.

Có cách tiếp cận tốt hơn để thực hiện không?

Cập nhật:

Cách tiếp cận sau có tốt hơn không?

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

Trả lời

1

Nhìn vào câu trả lời của tôi cho Problem in detecting Internet Connection in Android.

Bạn có thể nhận được phản hồi NETWORK_TYPE_UNKNOWN nếu mạng không khả dụng hoặc vẫn đang kết nối.

+0

Mmh. Vấn đề của tôi là tôi không muốn kiểm tra tính khả dụng của dữ liệu. Khi sử dụng phương thức ConnectivityManager getActiveNetworkInfo() Tôi nhận được mạng dữ liệu hoạt động. Đó không phải là thông tin tôi muốn nhận được. Tôi chỉ muốn biết liệu tôi có được kết nối với mạng di động hay không. (nó không quan trọng nếu tôi có một kết nối dữ liệu) –

+0

Hoặc nó sẽ là đủ để lặp qua tất cả các mạng có sẵn và kiểm tra một mạng di động? –

4

Đối với tôi việc PhoneStateListener tốt:

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

Và đăng ký trong TelephonyManager:

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

Tại đăng ký quản lý điện thoại gọi phương thức onServiceChanged() trên đối tượng người nghe và vượt qua tình trạng hiện thời.

PS: PhoneStateListener sử dụng Trình xử lý để đăng kết quả lên chuỗi giao diện người dùng, vì vậy bạn nên tạo nó trong chuỗi giao diện người dùng.

7

tôi đã sử dụng đoạn mã sau để biết nếu tôi đang kết nối với mạng (không có dữ liệu di động):

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

Các NetworkOperator được trả về chỉ khi điện thoại được thực sự đăng ký vào mạng.

+0

Ý của bạn là sử dụng || toán tử thay vì && hoặc tôi chỉ nhầm lẫn? –

+0

Điều này đã hiệu quả đối với tôi. Cảm ơn – Seenu69

2

Tôi đang sử dụng phương pháp sau để kiểm tra tính khả dụng của kết nối mạng trong Android. Điều tốt nhất là bạn có thể sao chép phương thức này vì nó và có thể sử dụng nó để kiểm tra kết nối mạng. Nó kiểm tra kết nối của tất cả các mạng để đảm bảo liệu có bất kỳ mạng nào được kết nối hay không.

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

Tôi tin rằng điều này sẽ làm công việc ..

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (manager != null) { 
      NetworkInfo info = manager.getActiveNetworkInfo(); 
      if (info != null && info.isConnected()) { 
       networkAvailable = true; 
      } 
Các vấn đề liên quan