我有以下代码用于检查我的应用程序上的互联网连接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();
}
但是我遇到了一个问题,即如果我连接到wifi,我打开应用程序,它工作正常,但如果我关闭应用程序并关闭wifi并重新打开应用程序,它不会通过“无连接”的错误,我需要关闭我的设备,然后打开它,同样的情况是如果wifi关闭,我打开应用程序,它会抛出“无连接”的错误,如果我打开它,除非我关闭并打开设备,否则它会抛出相同的“无连接”错误。
答案 0 :(得分: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" />
这对你有帮助吗?
灵光
答案 1 :(得分:3)
答案简短:
public boolean isNetworkAvailable() {
ConnectivityManager connectivityManager = (ConnectivityManager)getActivity().getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
答案 2 :(得分: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;
使用另一种形式,如果“Network i”等于null,则检查!i.isConnected()
必须失败(i为空)。
答案 3 :(得分: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;
}
}
无线网络 -
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();
}
}
答案 4 :(得分: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" />
答案 5 :(得分: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");
}
}
}
在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" />
答案 6 :(得分:0)
我曾经检查过是否有连接,不要忘记检查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;
}
}
答案 7 :(得分: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();
}
答案 8 :(得分: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;
}
}
}
答案 9 :(得分:0)
此代码检查Wifi和移动设备
1-添加此权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2-创建一个class
以命名Internet
和copy
此代码
public class Internet {
Context context;
public Internet(Context context) {
this.context = context;
}
public boolean HaveNetworkConnection() {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
return haveConnectedWifi || haveConnectedMobile;
}
}