2010-11-03 48 views
22

Tôi có mã sau đây để kiểm tra kết nối internet wifi/EDGE/GPRS/3G trên ứng dụng của tôi.Kiểm tra kết nối internet trên android

mã là

public static boolean checkConn(Context ctx) { 
    ConnectivityManager conMgr = (ConnectivityManager) ctx 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
     || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING) { 
     return true; 
    } else if (conMgr.getNetworkInfo(0).getState()==NetworkInfo.State.DISCONNECTED 
     || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED){ 
     return false; 
    } 
    return false; 
} 

và tôi gọi đó là như dưới đây:

if (CheckInternet.checkConn(introPage.this) == true) { 
    Intent toMainPage = new Intent(introPage.this, mainPage.class); 
    System.gc(); 
    startActivity(toMainPage); 
} else if (CheckInternet.checkConn(getApplicationContext()) == false) { 
    Toast.makeText(getApplicationContext(), 
     "Sorry, No internet connectivity found", Toast.LENGTH_SHORT) 
      .show(); 
} 

Nhưng tôi đang gặp một vấn đề, đó là nếu tôi kết nối với wifi, và tôi mở ứng dụng, nó hoạt động tốt, nhưng nếu tôi đóng ứng dụng và tắt wifi và mở lại ứng dụng, nó không thông qua lỗi "không có kết nối", tôi cần phải tắt thiết bị của tôi và sau đó bật nó lên, và trường hợp tương tự là nếu wifi tắt, và tôi mở ứng dụng, nó sẽ ném lỗi "không có kết nối", và nếu tôi bật nó lên, nó vẫn ném s cùng một lỗi của "không có kết nối", cho đến khi trừ khi tôi tắt và trên thiết bị.

+0

đóng ứng dụng bằng cách nhấn nhà hoặc phím trở lại .. Coz nếu u đóng nó lại bằng cách nhấn HME sau đó ứng dụng sẽ ở chế độ nền và onCreate sẽ không bị sa thải – DeRagan

+0

@Rahul, nhưng tại sao thậm chí bật wifi, nó vẫn không đưa ra vấn đề kết nối? – kaibuki

+0

Tôi không chắc chắn là nơi bạn đang gọi dòng mã này ... Nếu bạn chỉ đang kiểm tra tình trạng này trong các hoạt động oncreate nó sẽ được gọi chỉ một lần ... – DeRagan

Trả lời

68

Đôi khi kết nối hiện hoạt không phải là đầu tiên trong danh sách hoặc không hoạt động hoặc ở trạng thái lỗi. Đây là cách tôi sẽ làm điều đó:

NetworkInfo i = conMgr.getActiveNetworkInfo(); 
    if (i == null) 
    return false; 
    if (!i.isConnected()) 
    return false; 
    if (!i.isAvailable()) 
    return false; 
    return true; 

[EDIT 1] Đừng quên để thêm sự cho phép này trong biểu hiện ứng dụng:

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

Liệu điều này giúp bạn?

Emmanuel

+0

tôi đang tìm kiếm kiểm tra internet kết nối trên Android và tìm thấy câu trả lời của bạn. Nó trông đơn giản và tốt đẹp. Nhưng nó có kiểm tra 3G không? Cám ơn. – lomza

+2

Bạn phải kiểm tra loại mạng cho việc này. i.getType() == ConnectivityManager.TYPE_MOBILE và thậm chí bạn có thể nhận được loại phụ. i.getSubType() == TelephonyManager.NETWORK_TYPE_ * – Emmanuel

+0

Bạn cũng có thể sử dụng ConnectivityManager ==> http://stackoverflow.com/a/4009133/186636 –

2

là tốt hơn:

if (conMgr != null) { 
    NetworkInfo i = conMgr.getActiveNetworkInfo(); 
    if (i != null) { 
     if (!i.isConnected()) 
      ret = false; 
     if (!i.isAvailable()) 
      ret = false;     
    } 

    if (i == null) 
     ret = false; 

} else 
    ret = false; 

với các hình thức khác, nếu "Mạng i" là null bằng sau đó, kiểm tra sau khi cho !i.isConnected() phải thất bại (i là null).

+0

Tại sao không phải là phương pháp tiếp cận màu đen thay vì tiếp cận màu trắng? –

+0

Bạn sai, ở dạng khác "if (i == null)" sẽ "trả về false", vì vậy hãy bỏ qua tất cả các phần còn lại của séc.Ngoài ra theo cách khác có ít CC (ít anidation) – NicoGranelli

+0

'trở về' vượt trội hơn việc sử dụng 'else' ('else' khác cho ung thư) – SparK

2
public static boolean checkNetworkStatus(Context context) { 
    ConnectivityManager connectivity = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    TelephonyManager telephony = (TelephonyManager) context 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    NetworkStatus netStatus = new NetworkStatus(connectivity, telephony); 
    if (netStatus.isNetworkAvailable() == true) { 
     Log.e(" in checkNetworkStatus()", "network available"); 
     return true; 
    } else { 
     Log.e(" in checkNetworkStatus()", "no network"); 
     return false; 
    } 
} 

wifi-


void chkStatus() { 
    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(); 
    } 
} 
0

Hi thử đoạn mã sau:

public class NetworkCheckDemo extends Activity 
{ 
TextView tvstatus; 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    tvstatus=(TextView)findViewById(R.id.txtviewstatus); 
    ConnectivityManager cn=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo nf=cn.getActiveNetworkInfo(); 
    if(nf != null && nf.isConnected()==true) 
    { 
     Toast.makeText(this, "Network Available", Toast.LENGTH_LONG).show(); 
     tvstatus.setText("Network Available"); 
    } 
    else 
    { 
     Toast.makeText(this, "Network Not Available", Toast.LENGTH_LONG).show(); 
     tvstatus.setText("Network Not Available"); 
     } 
    } 
    } 

Thêm dưới 3 điều khoản trong Android Manifest File.

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

'CHANGE_NETWORK_STATE' là không cần thiết – njzk2

0

tôi sử dụng để kiểm tra xem tôi có khả năng kết nối, đừng quên kiểm tra xem NetworkInfo là null hay không vì trên máy tính bảng, nơi kết nối dữ liệu di động không được cung cấp, các NetworkInfo cho TYPE_MOBILE trở lại null.

public static boolean collectionAllowed(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(
      ConnectivityManager.TYPE_MOBILE); 
    State mobile = NetworkInfo.State.DISCONNECTED; 
    if (mobileInfo != null) { 
     mobile = mobileInfo.getState(); 
    } 
    NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(
      ConnectivityManager.TYPE_WIFI); 
    State wifi = NetworkInfo.State.DISCONNECTED; 
    if (wifiInfo != null) { 
     wifi = wifiInfo.getState(); 
    } 
    boolean dataOnWifiOnly = (Boolean) PreferenceManager 
      .getDefaultSharedPreferences(context).getBoolean(
        "data_wifi_only", true); 
    if ((!dataOnWifiOnly && (mobile.equals(NetworkInfo.State.CONNECTED) || wifi 
      .equals(NetworkInfo.State.CONNECTED))) 
      || (dataOnWifiOnly && wifi.equals(NetworkInfo.State.CONNECTED))) { 
     return true; 
    } else { 
     return false; 
    } 
} 
3

Câu trả lời ngắn:

public boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager = (ConnectivityManager)getActivity().getApplicationContext() 
               .getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null; 
} 
1

Hãy thử điều này:

public boolean isInternetAvailable(Context context) { 
     ConnectivityManager conMgr = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo i = conMgr.getActiveNetworkInfo(); 
      if (i == null) 
      return false; 
      if (!i.isConnected()) 
      return false; 
      if (!i.isAvailable()) 
      return false; 
      return true; 

    } 

và sự cho phép này:

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

0

giống như câu trả lời đã được phê duyệt nhưng trong ngắn hạn:

public static boolean isNetworkAvailable(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) 
      context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo info = cm.getActiveNetworkInfo(); 
    return info != null && info.isConnected() && info.isAvailable(); 
} 
0

Bạn có thể sử dụng tuyệt vời gist by emil2k:

import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.telephony.TelephonyManager; 

public class Connectivity { 
    public static NetworkInfo getNetworkInfo(Context context){ 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo(); 
    } 

    public static boolean isConnected(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected()); 
    } 

    public static boolean isConnectedWifi(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); 
    } 

    public static boolean isConnectedMobile(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE); 
    } 

    public static boolean isConnectedFast(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype())); 
    } 

    public static boolean isConnectionFast(int type, int subType){ 
     if(type==ConnectivityManager.TYPE_WIFI){ 
      return true; 
     }else if(type==ConnectivityManager.TYPE_MOBILE){ 
      switch(subType){ 
      case TelephonyManager.NETWORK_TYPE_1xRTT: 
       return false; // ~ 50-100 kbps 
      case TelephonyManager.NETWORK_TYPE_CDMA: 
       return false; // ~ 14-64 kbps 
      case TelephonyManager.NETWORK_TYPE_EDGE: 
       return false; // ~ 50-100 kbps 
      case TelephonyManager.NETWORK_TYPE_EVDO_0: 
       return true; // ~ 400-1000 kbps 
      case TelephonyManager.NETWORK_TYPE_EVDO_A: 
       return true; // ~ 600-1400 kbps 
      case TelephonyManager.NETWORK_TYPE_GPRS: 
       return false; // ~ 100 kbps 
      case TelephonyManager.NETWORK_TYPE_HSDPA: 
       return true; // ~ 2-14 Mbps 
      case TelephonyManager.NETWORK_TYPE_HSPA: 
       return true; // ~ 700-1700 kbps 
      case TelephonyManager.NETWORK_TYPE_HSUPA: 
       return true; // ~ 1-23 Mbps 
      case TelephonyManager.NETWORK_TYPE_UMTS: 
       return true; // ~ 400-7000 kbps 
      /* 
      * Above API level 7, make sure to set android:targetSdkVersion 
      * to appropriate level to use these 
      */ 
      case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 
       return true; // ~ 1-2 Mbps 
      case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 
       return true; // ~ 5 Mbps 
      case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 
       return true; // ~ 10-20 Mbps 
      case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 
       return false; // ~25 kbps 
      case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 
       return true; // ~ 10+ Mbps 
      // Unknown 
      case TelephonyManager.NETWORK_TYPE_UNKNOWN: 
      default: 
       return false; 
      } 
     }else{ 
      return false; 
     } 
    } 

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