在Android上检查互联网连接
我有我的应用程序检查互联网连接WiFi / EDGE / GPRS / 3G的以下代码。
代码是
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(); }
但我有一个问题,这是如果我连接到无线networking,我打开应用程序,它工作正常,但如果我closures应用程序,closuresWiFi和重新打开应用程序,它不会通过错误“没有连接”,我需要closures我的设备,然后打开它,同样的情况是,如果WiFiclosures,我打开应用程序,它会抛出“无连接”的错误,如果我打开它,仍然抛出“无连接”相同的错误,直到除非我closures设备。
有时,活动连接不是列表中的第一个,或者处于非活动状态或处于错误状态。 这是我将如何做到这一点:
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" />
这对你有帮助吗?
灵光
简短的回答:
public boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager)getActivity().getApplicationContext() .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null; }
更好:
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;
与其他forms,如果“networking我”是等于空那么,检查之后!i.isConnected()
必须失败(我为空)。
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; } }
无线上网-
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(); } }
尝试这个:
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" />
嗨,尝试下面的代码:
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"); } } }
在Android清单文件中添加以下3个权限。
<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" />
我曾经检查是否有连接性,不要忘记检查NetworkInfo是否为null,因为在未提供移动数据连接的平板电脑上,TYPE_MOBILE的NetworkInfo返回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; } }
与批准的答案一样,但总之:
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(); }
你可以使用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; } } }