检测Android上是否有可用的Internet连接
可能重复:
如何检查Android的互联网接入? InetAddress从不超时
我需要检测Android设备是否连接到Internet。
NetworkInfo
类提供了一个非静态方法isAvailable()
,听起来很完美。
问题是:
NetworkInfo ni = new NetworkInfo(); if (!ni.isAvailable()) { // do something }
抛出这个错误:
The constructor NetworkInfo is not visible.
安全的赌注是有另一个类返回一个NetworkInfo
对象。 但我不知道是哪一个。
- 如何让上面的代码片段工作?
- 我怎么能find我在线文档中需要的信息?
- 你能提出一个更好的方法来进行这种types的检测吗?
ConnectivityManager
的getActiveNetworkInfo()
方法返回一个NetworkInfo
实例,表示可以find的第一个连接的networking接口,如果没有接口ConnectivityManager
返回null
。 检查这个方法是否返回null
应该足以说明互联网连接是否可用。
private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); }
您还需要:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
在你的Android清单。
编辑:
请注意,拥有活动的networking接口并不能保证特定的networking服务可用。 networking问题,服务器停机时间,低信号,强制门户,内容filter等都可以阻止你的应用程序到达服务器。 例如,您无法确定您的应用是否可以访问Twitter,直到您收到来自Twitter服务的有效回复。
我检查无线上网和移动互联网如下…
private boolean haveNetworkConnection() { boolean haveConnectedWifi = false; boolean haveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager) 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; }
显然,它可以很容易地修改,以检查个别特定的连接types,例如,如果您的应用程序需要Wi-Fi的潜在更高的速度正常工作等。
第1步:在你的项目中创build一个类AppStatus(你也可以给其他名字)。 那么请把下面的代码粘贴到你的代码中:
import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.util.Log; public class AppStatus { private static AppStatus instance = new AppStatus(); static Context context; ConnectivityManager connectivityManager; NetworkInfo wifiInfo, mobileInfo; boolean connected = false; public static AppStatus getInstance(Context ctx) { context = ctx.getApplicationContext(); return instance; } public boolean isOnline() { try { connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); connected = networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected(); return connected; } catch (Exception e) { System.out.println("CheckConnectivity Exception: " + e.getMessage()); Log.v("connectivity", e.toString()); } return connected; } }
第2步:现在检查您的设备是否具有networking连接,然后只要添加此代码段,你想检查的地方…
if (AppStatus.getInstance(this).isOnline()) { Toast t = Toast.makeText(this,"You are online!!!!",8000).show(); } else { Toast t = Toast.makeText(this,"You are not online!!!!",8000).show(); Log.v("Home", "############################You are not online!!!!"); }
另外一个重要的说明。 你必须在你的AndroidManifest.xml中设置android.permission.ACCESS_NETWORK_STATE
才能工作。
_我怎么能在网上文件中find我需要的信息?
你只需要正确地阅读类的文档,你会发现你正在寻找的所有答案。 查看ConnectivityManager上的文档。 描述告诉你该怎么做。
ConnectivityManager的getActiveNetworkInfo()方法返回一个NetworkInfo实例,表示可以find的第一个连接的networking接口,如果接口连接,则返回null。 检查这个方法是否返回null应该足以说明互联网连接是否可用。
private boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null; }
您还需要:
在你的Android清单。
编辑:
请注意,拥有活动的networking接口并不能保证特定的networking服务可用。 networking问题,服务器停机时间,低信号,强制门户,内容filter等都可以阻止你的应用程序到达服务器。 例如,您无法确定您的应用是否可以访问Twitter,直到您收到来自Twitter服务的有效回复。
getActiveNetworkInfo()不应该永远不会给null。 当他们提出这个问题时,我不知道他们在想什么。 它总是给你一个对象。
也许我发现自己:
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();