简体   繁体   English

即使已连接wifi或3G,也请检查互联网连接

[英]Check internet connection even if connected to wifi or 3G

I need to check if there is internet connection even if the phone is connected to a wifi network or 3G. 我需要检查是否有互联网连接,即使手机已连接到wifi网络或3G。 I have this code but it says only if connected to a network: 我有此代码,但仅在连接到网络时才说:

public class ConnectionDetector {

    private Context _context;

    public ConnectionDetector(Context context){
        this._context = context;
    }

    public boolean isConnectingToInternet(){
        ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
          if (connectivity != null) 
          {
              NetworkInfo[] info = connectivity.getAllNetworkInfo();
              if (info != null) 
                  for (int i = 0; i < info.length; i++) 
                      if (info[i].getState() == NetworkInfo.State.CONNECTED)
                      {
                          return true;
                      }

          }
          return false;
    }
}

You can use the following to detect if either 3G or WiFi is connected 您可以使用以下内容检测是否连接了3G或WiFi

ConnectivityManager man = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

//3G
boolean is3gConnected = man.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();

//Wifi
boolean isWifiConnected = man.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();

I have created this class to get if the user is connected on the internet and what type of connection he has 我创建了此类,以了解用户是否已连接到互联网以及他具有哪种类型的连接

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;

public class NetWork {

    private static boolean connectionEstablished = false;

    /**
     * get the internet connection of the device
     *
     * @param context
     * @return the type of internet connection
     */
    private static NetWorkTypes getNetwork(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();

        if (info == null || !info.isConnected())
            return NetWorkTypes.NO_CONNECTION;

        if (info.getType() == ConnectivityManager.TYPE_WIFI)
            return NetWorkTypes.WIFI;

        if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
            int networkType = info.getSubtype();
            switch (networkType) {
                case TelephonyManager.NETWORK_TYPE_GPRS:
                case TelephonyManager.NETWORK_TYPE_EDGE:
                case TelephonyManager.NETWORK_TYPE_CDMA:
                case TelephonyManager.NETWORK_TYPE_1xRTT:
                case TelephonyManager.NETWORK_TYPE_IDEN: // all above for 2G

                case TelephonyManager.NETWORK_TYPE_UMTS:
                case TelephonyManager.NETWORK_TYPE_EVDO_0:
                case TelephonyManager.NETWORK_TYPE_EVDO_A:
                case TelephonyManager.NETWORK_TYPE_HSDPA:
                case TelephonyManager.NETWORK_TYPE_HSUPA:
                case TelephonyManager.NETWORK_TYPE_HSPA:
                case TelephonyManager.NETWORK_TYPE_EVDO_B:
                case TelephonyManager.NETWORK_TYPE_EHRPD:
                case TelephonyManager.NETWORK_TYPE_HSPAP: // all above for 3G

                case TelephonyManager.NETWORK_TYPE_LTE:   // 4G
                    return NetWorkTypes.MOBILE_NETWORK;
                default:
                    return NetWorkTypes.UNKNOWN;
            }
        }
        return NetWorkTypes.UNKNOWN;
    }

    /**
     * check if device is connected on the internet
     *
     * @param context
     * @return true if is connected, false if isn't
     */
    public static boolean isConnected(Context context) {
        NetWorkTypes netWorkType;
        netWorkType = getNetwork(context);
        if (netWorkType == NetWorkTypes.WIFI || netWorkType == NetWorkTypes.MOBILE_NETWORK) {
            connectionEstablished = true;
        } else {
            connectionEstablished = false;
        }
        return connectionEstablished;
    }

    /**
     * @return the boolean that tells if there is connection on the internet
     */
    public static boolean getConnectionEstablished() {
        return connectionEstablished;
    }
}

NetWorkTypes is just an enum. NetWorkTypes只是一个枚举。 You can return anything else you wish 您可以退还其他任何东西

You say Check *internet* connection even if connected to wifi or 3G , however you implementation will not actually test this, as simply being connected to a WiFi network does not mean that you have internet connectivity. 您说即使连接到wifi或3G也要检查* internet *连接 ,但是您的实现实际上不会对此进行测试,因为仅连接到WiFi网络并不意味着您具有Internet连接。 As a suggestion, you could attempt opening a socket to a known host - if the connection is successful, you can be sure that you have network access. 作为建议,您可以尝试打开到已知主机的套接字-如果连接成功,则可以确保您具有网络访问权限。

public boolean hasInternetConnectivity() {

    try {
        // connect to google on port 80, the HTTP port
        Socket s = new Socket("www.google.com", 80);

        // the above would have thrown if failed, so we are good
        s.close();
        return true;
    } catch (Exception e) {

        // check logcat to see why it failed, you could then catch and handle each exception independently ( time out, host unknown, end of stream, etc.. )
        e.printStackTrace();

        // the connection has failed, return false
        return false;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM