2010-11-03 161 views
22

我有以下代码用于检查我的应用程序上的互联网连接WiFi/EDGE/GPRS/3G。在Android上检查互联网连接

代码

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

,我称之为象下面这样:

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

,但我有一个问题,就是如果我连接到无线网络,我打开应用程序,它工作正常,但如果我关闭应用程序,并关闭WiFi并重新打开应用程序,它不会通过“无连接”的错误,我需要关闭我的设备,然后打开它,同样的情况下如果WiFi关闭,我打开应用程序,它会抛出“无连接”的错误,如果我打开它,仍然会抛出与“无连接”相同的错误,除非我关闭设备。

+0

关闭应用..表兄弟姐妹如果u按HME关闭它,然后应用程序会在后台和OnCreate中不会被解雇 – DeRagan 2010-11-03 10:41:21

+0

@Rahul,但为什么即使打开wifi,它仍然没有连接问题? – kaibuki 2010-11-03 10:43:47

+0

我不知道你在哪里调用这一行代码...如果你只是检查这个条件下的活动创建它将只被称为一次... – DeRagan 2010-11-03 10:48:58

回答

68

有时活动连接不是列表中的第一个,或者不活动或处于错误状态。这是我会怎么做:

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

[编辑1]不要忘了在应用程序清单中添加该权限:

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

这是否帮助你吗?

灵光

+0

我一直在寻找互联网检查在Android上连接并找到您的答案。它看起来简单而好看。但它也检查3G吗?谢谢。 – lomza 2011-09-21 13:31:59

+2

您必须检查网络的类型。 i.getType()== ConnectivityManager.TYPE_MOBILE,你甚至可以获得子类型。 i.getSubType()== TelephonyManager.NETWORK_TYPE_ * – Emmanuel 2011-09-21 14:50:30

+0

你也可以使用ConnectivityManager ==> http://stackoverflow.com/a/4009133/186636 – 2012-04-13 19:05:13

2

更好:

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; 

与其他形式,如果 “网络I” 等于空,然后,检查后!i.isConnected()一定会失败(我为空)。

+0

为什么不用黑色方法而不是白色方法? – 2012-02-13 07:27:01

+0

你错了,在其他形式“if(i == null)”将“返回false”,所以跳过所有其余的检查。同样在另一种方式,有较少的CC(较少的帮助) – NicoGranelli 2012-02-17 20:46:00

+0

'返回'优于'使用'其他' ('其他'给予癌症) – SparK 2013-06-19 18:39:37

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

喜试试下面的代码:

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

添加以下3级权限的Android清单文件。

<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”不是必要的 – njzk2 2013-12-04 21:30:04

0

我来检查,如果我有连接,不要忘记检查的NetworkInfo为空或不是,因为在未进行TYPE_MOBILE返回NULL提供的移动数据连接,该平板电脑的NetworkInfo。

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

简短的回答:

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

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

试试这个:

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; 

    } 

与此权限:

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

0

一样的批准的答案,但在短期:

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

您可以使用此真棒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; 
     } 
    } 

}