2010-02-24 31 views
57

Tôi muốn kiểm tra kết nối internet trong mỗi hoạt động. Nếu nó bị mất một tin nhắn sẽ được hiển thị.Làm cách nào để kiểm tra kết nối internet trong Android?

Bất kỳ ai có thể hướng dẫn tôi cách đạt được điều này không?

+0

Điều này có thể giúp một số http://www.gadgetsaint.com/android/no-internet-connectivity-android/ – ASP

Trả lời

61

Bạn có thể sử dụng ConnectivityManager để kiểm tra trạng thái mạng.

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

if (conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED 
    || conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) { 

    // notify user you are online 

} 
else if (conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.DISCONNECTED 
    || conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.DISCONNECTED) { 

    // notify user you are not online 
} 

Lưu ý rằng các hằng số ConnectivityManager.TYPE_MOBILE và ConnectivityManager.TYPE_WIFI thể hiện loại kết nối và hai giá trị này không đầy đủ. Xem here để biết danh sách đầy đủ.


Cũng đảm bảo rằng bạn có quyền cần thiết để theo dõi trạng thái mạng. Bạn cần phải thêm giấy phép này để AndroidManifest.xml của bạn:

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

cho tôi lỗi sau Khả năng kết nốiService: Không có người dùng 10026 hoặc quy trình hiện tại nào có android.permission.ACCESS_NETWORK_STATE. trên conMgr.getNetworkInfo – UMAR

+28

Bạn phải thêm dòng này vào AndroidManifest.xml:

+2

ok một điều tôi đã nhận thấy. Khi wifi được kết nối với vùng phủ sóng internet modem không dây là có hay không nó luôn luôn nói có bạn đang conected nó chỉ kiểm tra wifi conectivity không kết nối internet để làm thế nào để xử lý một tình huống như vậy? – UMAR

5

Correction

if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
    || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING ) { 
    //notify user you are online 
} 

nên

if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
    || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED) { 
    //notify user you are online 
} 
+1

ok một điều tôi đã nhận thấy .. khi wifi được kết nối với vùng phủ sóng internet modem không dây là có hay không nó luôn luôn nói có bạn đang conected nó chỉ kiểm tra wifi conectivity không kết nối internet để làm thế nào để xử lý như vậy ? – UMAR

120

Chỉ có một kết nối có thể được hoạt động tại bất kỳ một thời điểm. Vì vậy, một câu trả lời đơn giản là:

final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); 
if (activeNetwork != null && activeNetwork.isConnected()) { 
    // notify user you are online 
} else { 
    // notify user you are not online 
} 

Nó cũng phục vụ cho bất kỳ loại mới của mạng như ConnectivityManager # TYPE_WIMAX


Ngoài ra hãy chắc chắn rằng bạn có quyền yêu cầu giám sát trạng thái mạng. Bạn cần phải thêm giấy phép này để AndroidManifest.xml của bạn:

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

Phản hồi tốt nhất. +1 –

+0

Có một tên phương thức 'isConnected()' cho thông tin mạng có thể thay thế dòng '.getState() == ...' của bạn và làm cho nó đơn giản hơn? – bytebender

+0

Rất vui khi chọn #bytebender. Tôi đã sửa đổi giải pháp. Thậm chí đơn giản hơn bây giờ :-) – William

10

Bạn có thể làm điều này, với nhiều loại hình trạng mạng

public void checkNetworkStatus(){ 

    final ConnectivityManager connMgr = (ConnectivityManager) 
    this.getSystemService(Context.CONNECTIVITY_SERVICE); 

    final android.net.NetworkInfo wifi = 
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

    final android.net.NetworkInfo mobile = 
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    if(wifi.isAvailable()){ 

    Toast.makeText(this, "Wifi" , Toast.LENGTH_LONG).show(); 
    } 
    else if(mobile.isAvailable()){ 

    Toast.makeText(this, "Mobile 3G " , Toast.LENGTH_LONG).show(); 
    } 
    else 
    { 

     Toast.makeText(this, "No Network " , Toast.LENGTH_LONG).show(); 
    } 

} 
6

Bạn có thể kiểm tra vùng phủ sóng mạng và dữ liệu sẵn có của di động và Wi- fi trực tiếp với

Đối Mạng phủ sóng tính sẵn sàng,

private boolean isNetworkAvailable() 
{ 
ConnectivityManager conxMgr = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); 

NetworkInfo mobileNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
NetworkInfo wifiNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

return ((mobileNwInfo== null ? false : mobileNwInfo.isAvailable()) || (wifiNwInfo == null ? false : wifiNwInfo.isAvailable())); 

} 

Đối dữ liệu sẵn có nếu mạng có sẵn

private boolean isDataAvailable() 
{ 
    ConnectivityManager conxMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 

NetworkInfo mobileNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
NetworkInfo wifiNwInfo = conxMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

return ((mobileNwInfo== null? false : mobileNwInfo.isConnected())|| (wifiNwInfo == null? false : wifiNwInfo.isConnected())); 
} 
1

Bạn đang không sử dụng ConnectivityManager.getNetworkInfo(0).getState()ConnectivityManager.getNetworkInfo(1).getState() đúng cách, thay vì thể xác định rõ giá trị (1) và (0) sử dụng ConnectivityManager.TYPE_WIFIConnectivityManager.TYPE_MOBILE

0

Đây là một boolean kiểm tra xem bạn có quyền truy cập mạng không. Nó không xác định loại truy cập mạng nào - di động, wifi ..., nó chỉ kiểm tra xem bạn có trực tuyến hay không.

boolean mobileNwInfo = false; 
ConnectivityManager conxMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
try { mobileNwInfo = conxMgr.getActiveNetworkInfo().isConnected(); } 
catch (NullPointerException e) { mobileNwInfo = false; } 
if (mobileNwInfo == false) { 
    // Your code goes here... 
} 
3

đăng ký một máy thu phát sóng để xử lý CONNECTIVITY_ACTION. Xem này full example.Bạn nên cập nhật một biến tĩnh 'connectionAvailable' sẽ có thể truy cập ở khắp mọi nơi và mọi lúc thông qua trình lấy tương ứng của nó.

Ghi tuyên bố thu phát sóng trong manifest file:

<receiver android:name=".NetworkConnectivityReceiver" android:enabled="true"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 

Về vấn đề 'kiểm tra trong từng hoạt động, có thể bạn sẽ quan tâm trong việc sử dụng một BaseActivity mở rộng bởi các hoạt động của bạn và quản lý kiểm tra kết nối và hiển thị thông báo.

Ngoài ra, lưu ý rằng sử dụng sự kiện (không bỏ phiếu từ hoạt động) sẽ hiệu quả hơn.

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