internet-connection - 安卓检测是否有某个Internet的可用连接

  显示原文与译文双语对照的内容

可能重复:
如何在Android上检查互联网访问? 地址从不超时

我需要检测Android设备是否连接到互联网。

NetworkInfo 类提供了一个non-static方法 isAvailable(),它听起来很完美。

问题是:


NetworkInfo ni = new NetworkInfo();
if (!ni.isAvailable()) {
//do something
}

抛出这里错误:


The constructor NetworkInfo is not visible.

安全的赌注是另一个类返回一个 NetworkInfo 对象。 但我不知道。

  1. 如何获取上代码 Fragment?
  2. 如何在联机文档中找到我需要的信息?
  3. 你能为这种类型的检测提供更好的方法?
时间:

getActiveNetworkInfo()ConnectivityManager 方法返回一个 NetworkInfo 实例,代表它可以找到的第一个连接的网络接口,如果没有连接任何接口,则返回 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清单中。

编辑:

请注意,有活动的网络界面不能保证特定的网络服务可用。 网络问题,服务器停机,低信号,捕获门户,内容过滤器等都可以阻止你的应用程序到达服务器。 例如你无法确定你的应用程序是否能到达 Twitter,直到你收到来自 Twitter 服务的有效响应。

我检查 Wi-Fi 和移动互联网如下所示。。


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

很明显,这样即可方便地修改单个特定的连接类型,以检查是否有 比如 Wi-Fi的,如果你的应用需要对潜在的更高的速度才能正常工作等等。

在你步 1: 创建类 然后请将下面的代码粘贴到代码中:


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: 现在检查你的设备是否有网络连接,然后在你想检查的地方添加这里代码段。。


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

另一个重要的注意事项。你必须设置 android.permission.ACCESS_NETWORK_STATE 在你的AndroidManifest.xml 中执行这里操作。

我怎么能找到我在在线文档中所需要的信息?

于,你只需要阅读文档的相关的类正确还是不够的,你会发现所有的答案你 looking. 查看 ConnectivityManager 。xml文档的文档。 描述告诉你应该做什么。

getActiveNetworkInfo() 方法ConnectivityManager返回一个NetworkInfo实例,代表它可以查找或者设置这里输入第一个连接的网络接口,如果接口是通的。 检查这里方法是否返回null应该足以判断是否有互联网连接可用。


private boolean isNetworkAvailable() {
 ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
 NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
 return activeNetworkInfo!= null; 
}

你还需要:

在你的android清单中。

编辑:

请注意,有活动的网络界面不能保证特定的网络服务可用。 网络问题,服务器停机,低信号,捕获门户,内容过滤器等都可以阻止你的应用程序到达服务器。 例如你无法确定你的应用程序是否能到达 Twitter,直到你收到来自 Twitter 服务的有效响应。

getActiveNetworkInfo() 不应该给出 null 。 我不知道他们是什么时候想到的。 它应该给你一个对象。

可能我已经找到自己了:


ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo().isConnectedOrConnecting();

...