2013-07-23 72 views
5

Có một số câu hỏi liên quan đến cách phát hiện kết nối mạng trong Android. https://stackoverflow.com/a/4239019/90236 cung cấp câu trả lời rất chi tiết và https://stackoverflow.com/a/8548926/90236 hiển thị các phương pháp để xác định loại mạng mà mạng được kết nối.Phát hiện kết nối mạng bị hạn chế trong Android?

Chúng tôi phát hiện khả năng kết nối mạng sử dụng mã tương tự như những câu trả lời như:

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 

Điều này cho phép chúng tôi cảnh báo người dùng nếu họ đang offline. Tuy nhiên, nó không giúp chúng tôi xác định liệu người dùng có kết nối hạn chế hay không. Có điều kiện kết nối hạn chế đã khiến người dùng phàn nàn. Chúng bao gồm:

  1. Người dùng được kết nối với mạng wifi gia đình nhưng modem cáp hoặc dịch vụ Internet không khả dụng.

  2. Người dùng ở trong một khách sạn hoặc quán cà phê và kết nối thành công với mạng wifi, nhưng mạng yêu cầu họ đăng nhập hoặc đồng ý với điều khoản dịch vụ trước khi họ được cấp quyền truy cập mạng đầy đủ.

Trong cả hai trường hợp này, thử nghiệm isNetworkAvailable() của chúng tôi trả về true. Hệ điều hành cho chúng ta biết chúng tôi đang kết nối với mạng. Tuy nhiên, người dùng không có kết nối Internet khả dụng.

Có cách nào tốt để xác định rằng người dùng có kết nối mạng đầy đủ chức năng?

Tôi đang xem xét việc gọi một dịch vụ web nhẹ để xác minh kết nối của họ và cảnh báo người dùng nếu ứng dụng không nhận được trả lại hợp lệ từ dịch vụ. Đây có phải là quá mức cần thiết không? hoặc có người khác phải sử dụng các kỹ thuật tương tự?

Trả lời

8

Có cách nào tốt để xác định rằng người dùng có kết nối mạng đầy đủ chức năng?

Hãy thử tải xuống nội dung nào đó từ đâu đó. Lý tưởng nhất, "một nơi nào đó" là máy chủ của riêng bạn, để kiểm tra kết nối giữa thiết bị và máy chủ của bạn.

Than ôi, không có phương thức doesTehConnexionSuck() hoặc iCanHazBandwidth() trên ConnectivityManager. :-)

Đây có phải là quá mức cần thiết không?

Với tinh thần "Goldilocks và Three Bears", tôi mô tả đó là justrightkill.

Chúng tôi cũng phải làm the same sorts of shenanigans in Web apps.

+1

Tôi thích ý tưởng "justrightkill" nhưng nó không có chiếc nhẫn cùng với nó - http://www.youtube.com/watch?v=YjETcbEDmoQ –

+0

haha ​​rất hài hước ..... –

3

Để hoàn tất, hãy để tôi đăng một số mã mà tôi đã thêm. Tôi nghĩ rằng đó là mã HttpClient khá chung chung để thực hiện một yêu cầu Http và trả về true khi yêu cầu thành công. Tôi đã sử dụng HttpHead vì tôi không quan tâm đến thực thể trong phản hồi và điều này sẽ làm cho nó nhanh hơn. Phương thức này nằm trong một lớp được gọi là ConnectivityHelper và DefaultSettings là một lớp có một loạt các hằng số hữu ích được định nghĩa.

public static boolean isNetworkAvailable() { 
    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo; 

    try { 
     netInfo = manager.getActiveNetworkInfo(); 
    } catch (Exception e) { 
     netInfo = null; 
    } 

    return netInfo != null && netInfo.isConnected() && testConnection(DefaultSettings.TEST_CONNECTION_URL); 
} 


private static boolean testConnection(String url) { 
    HttpClient httpClient = null; 
    HttpHead request = null; 
    HttpResponse response = null; 
    int statusCode = 0; 

    try { 
     HttpParams myParams = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(myParams, DefaultSettings.CONNECTION_TIMEOUT); 
     HttpConnectionParams.setSoTimeout(myParams, DefaultSettings.SO_TIMEOUT); 

     httpClient = new DefaultHttpClient(myParams); 

     request = new HttpHead(url); 
     response = httpClient.execute(request); 
     statusCode = response.getStatusLine().getStatusCode(); 

     if (statusCode != 200) 
     { 
      Log.e(ConnectivityHelper.class.getName(), String.format("testConnection not successful. For %s - Status code = %d", url, statusCode)); 
      return false; 
     } 
     return true; 

    } catch(ClientProtocolException e) { 
     Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString())); 

     if (request != null && !request.isAborted()) { 
      request.abort(); 
     } 

     return false; 
    } catch(IOException e) { 
     if (statusCode == 401) { 
      Log.e(ConnectivityHelper.class.getName(), String.format("testConnection access denied. For %s - Status code = %d", url, statusCode));    
     } else { 
      Log.e(ConnectivityHelper.class.getName(), String.format("testConnection failure. For %s - Exception: %s.", url, e.toString())); 
     } 

     if (request != null && !request.isAborted()) { 
      request.abort(); 
     } 

     return false; 
    } finally { 
     if (httpClient != null) { 
      httpClient.getConnectionManager().shutdown(); 
     } 
    }   
} 
+0

Tôi nghĩ bạn nên đánh dấu câu trả lời của BẠN là được chấp nhận. – dentex

+0

Vâng, đó là câu trả lời được đăng bởi @CommonsWare dẫn tôi viết mã trên, vì vậy câu trả lời của anh ấy là đầu tiên và thực sự hữu ích. Phần còn lại, như họ nói, chỉ là một bài tập. –

+0

đủ công bằng. :) – dentex

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