如何确定Android设备的互联网连接?

7

我该如何确定Android设备当前可用的互联网连接类型?例如,返回WiFi、3G或无连接。

4个回答

7
你可以使用这个来确定是否连接:
final ConnectivityManager connectManager = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE); // ctx stands for the Context
final NetworkInfo mobile = connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
final NetworkInfo wifi   = connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI  );

// Return true if connected, either in 3G or wi-fi
return ((mobile != null && mobile.getState() == NetworkInfo.State.CONNECTED) || 
        (wifi   != null && wifi.getState()   == NetworkInfo.State.CONNECTED)   );
}

这段代码需要获取 ACCESS_NETWORK_STATEACCESS_WIFI_STATE 权限。 编辑: public NetworkInfo getNetworkInfo (int networkType)在API 21中已被弃用。对于API级别高于20的情况,您可以按照以下方式进行:
final Network[] networks = connectManager.getAllNetworks();
boolean connected = false;

for (int ctr = 0; !connected && ctr < networks.length; ++ctr) {
    final NetworkInfo network = connectManager.getNetworkInfo(networks[ctr]);
    final int netType = network.getType();

    connected = (network.getState() == NetworkInfo.State.CONNECTED) &&
            (
                netType == ConnectivityManager.TYPE_MOBILE     ||
                netType == ConnectivityManager.TYPE_WIFI     /*||
                netType == ConnectivityManager.TYPE_WIMAX      ||
                netType == ConnectivityManager.TYPE_ETHERNET */  );
}

return connected;

我根据提问者的问题将代码限制在Wi-Fi和3G上,但是很容易将其扩展到新添加的连接类型,比如以太网或Wi-Max。

你的代码看起来很有前途,但我无法解决“ctx无法解析”的问题。 - L. D. James
@L.D.James ctx 就是 Context。所以,例如这段代码应该放在一个 Activity 中。 (啊,也许这就是为什么这个答案很久以前被踩了) - Shlublu
感谢您的输入和关注您的示例。这样就解决了错误。我将其放在MainActivity文件的一个方法中public boolean connectiontype()。当调用Android时会崩溃。我在清单中添加了"Internet"。是否应该添加其他权限?我看到您创建了一个“在聊天中继续此讨论”的链接,我试图跟随它,但它不可用。如果您方便时打开一个链接,我会跟进以协助调试答案...或者在这里跟进我发现的内容。 - L. D. James
1
我在学习和测试代码时发布了三个评论/问题。它非常有效,精确和清晰。最初它崩溃了,但是清单权限ACCESS_NETWORK_STATEACCESS_WIFI_STATE解决了这些崩溃问题。 - L. D. James
我本来要回复你之前的评论,但你已经替我回答了 :) 谢谢! - Shlublu
显示剩余9条评论

2

不知道为什么你的应用程序会崩溃,也许这可以帮助你。 也许尝试这个方法:(需要应用程序上下文)

 public static boolean isInternetConnectionActive(Context context) {
  NetworkInfo networkInfo = ((ConnectivityManager) context
    .getSystemService(Context.CONNECTIVITY_SERVICE))
    .getActiveNetworkInfo();

  if(networkInfo == null || !networkInfo.isConnected()) {
   return false;
  }
  return true;
 }

那么尝试调用。
if(isInternetConnectionActive(getApplicationContext)) {
 /* start Intent */
}
else {
  /* show Toast */
}

希望这能帮助到您。

1

看看这篇帖子,我回答了同样的问题{{link1:如何在Android应用程序中保存请求并重新发送}}


0

不是的,这就是为什么我说“如果有人需要知道所使用的移动网络类型”,您也可以这样做。至少其他答案只是说连接是WiFi还是移动数据。 - Intrications

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