即使连接到wifi或3G,也要检查互联网连接



即使手机连接到wifi网络或3G,我也需要检查是否有互联网连接。我有这个代码,但它说只有连接到网络时:

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

您说即使连接到wifi或3G,也要检查*internet*连接,但您的实现不会实际测试这一点,因为简单地连接到wifi网络并不意味着您拥有互联网连接。作为一个建议,你可以尝试打开一个已知主机的套接字——如果连接成功,你可以确保你有网络访问权限。

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

我创建了这个类来了解用户是否在互联网上连接,以及他有什么类型的连接

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只是一个枚举。您可以返回任何其他想要的

您可以使用以下方法检测是否连接了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();

最新更新