在安卓设备上检查网络连接

5

你好,我有一个基于从互联网检索的数据的应用程序...

如果没有可用的连接,我该如何处理我的应用程序?

我可以使用以下方法检测连接:

ConnectivityManager cm = (ConnectivityManager) 
getSystemService(this.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo().isConnectedOrConnecting();

它运行良好...但是我如何在知道没有连接时防止强制错误?我希望显示一条消息 - 类似于:“抱歉!没有可用的互联网连接!”而不是我的应用程序崩溃...


2
使用您刚提到的方法来测试是否有互联网连接。如果没有,只需显示一个AlertDialog并不尝试连接即可。更不用说Socket通信(如果您使用的是这种方式)应该在try/catch语句块中,这意味着您可以轻松地捕获异常。我看不出有什么问题。 - Codemonkey
6个回答

36
 /**
   * Checks if the device has Internet connection.
   * 
   * @return <code>true</code> if the phone is connected to the Internet.
   */
  public static boolean hasConnection() {
    ConnectivityManager cm = (ConnectivityManager) MbridgeApp.getContext().getSystemService(
        Context.CONNECTIVITY_SERVICE);

    NetworkInfo wifiNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    if (wifiNetwork != null && wifiNetwork.isConnected()) {
      return true;
    }

    NetworkInfo mobileNetwork = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    if (mobileNetwork != null && mobileNetwork.isConnected()) {
      return true;
    }

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    if (activeNetwork != null && activeNetwork.isConnected()) {
      return true;
    }

    return false;
  }

1
在运行2.2.2的HTC Desire上,存在一个错误,即getActiveNetworkInfo()始终返回null。这段代码很棒,因为它仍然有效,只有在需要时才会回退到getActiveNetworkInfo()。 - Kieran
1
这是我发现的最可靠的检查网络连接的示例,加一分。 - alice_silver_man

4

getActiveNetworkInfo()可能返回null,这样你就会遇到强制关闭的情况,但你可以这样做:

ConnectivityManager cm = (ConnectivityManager) 
getSystemService(this.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (null == ni)
    return false;
return ni.isConnectedOrConnecting();

然后检查就很简单:
if (networkAvailable()) // << your method from above
{
// Do stuff
}
else
{
   Toast.makeToast(yourcontext, "No network available", Toast.LENGTH_LONG).show();
}

但是当我得到这个时候,我该如何只显示消息告诉没有可用的连接并停止执行其他事情呢? - M.V.
@M.V. - 一分钟后请查看编辑后的答案。 - MByD
谢谢,但我是不是必须把它放在所有活动中,还是只需将其放在主要活动中即可? - M.V.
我不知道你的应用程序结构,所以很难说,但是要么将其放在访问网络的位置,要么如果你有一个处理连接并返回一些字符串的类,请将其放在那里。 - MByD

3

我不能发表评论,但请注意在上面所有答案中NetworkInfo.isConnectedOrConnecting();只会告诉您是否连接到路由器,而如果您连接到没有互联网访问权限的路由器,则应用程序将崩溃,因为它将抛出UnknownHostException。
您应该在try catch中添加以下catch语句块

catch (UnknownHostException e) {
    getRequest.abort();
    Log.w("unknownhostexception whicle connects to the host " + url, e);
    }

或者为您的请求设置任何您想要的超时时间。

1

为此,您需要在清单文件中拥有以下权限。

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

0
private boolean connectionAvailable() {
    boolean connected = false;
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    if (connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
        //we are connected to a network
        connected = true;
    }
    return connected;
}

0
ConnectivityManager conMgr  = ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
 NetworkInfo info = conMgr.getActiveNetworkInfo(); 

if(info != null && info.isConnected()) 
{
   // internet is there.
}
else
{
   // internet is not there.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接