2015-12-17 3 views
0

Мне нужно проверить, есть ли подключение к Интернету, даже если телефон подключен к Wi-Fi сети или 3G. У меня есть этот код, но он говорит, что только при подключении к сети:Проверьте подключение к Интернету, даже если оно подключено к Wi-Fi или 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; 
    } 
} 
+0

Вы смотрели в http://developer.android.com/training/efficient-downloads/connectivity_patterns.html – Petro

ответ

0

Я создал этот класс, чтобы получить, если пользователь подключен через Интернет, и какой тип связи он имеет

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 это просто перечисление. Вы можете вернуть все остальное, что пожелаете.

+0

я попробовал это, но, похоже, не работает, он просто пытается подключиться. –

+0

Хм, странно, это работает для меня ... вы вызвали метод isConnected? –

+0

да, я это называю. когда я подключен к Wi-Fi без Интернета, он переходит ко второму, если: if (info.getType() == ConnectivityManager.TYPE_WIFI) return NetWorkTypes.WIFI; –

0

Вы можете использовать следующие для обнаружения, если либо 3G или Wi-Fi подключен

ConnectivityManager man = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 

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

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

Будучи подключенным к сети, не обязательно означает быть подключен к Интернету ... – s3lph

0

Вы говорите, что Проверьте * интернет * соединение, даже если оно подключено к Wi-Fi или 3G, однако реализация на самом деле не будет проверять это, поскольку простое подключение к сети 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; 
} 
+0

Я попробую сегодня, но я изменю googl.com с моим webservice –

+0

Отлично, дайте мне знать, как это работает, и если у вас возникли какие-либо проблемы, я набрал без IDE, чтобы там была какая-то слепая ошибка: D –

+0

выглядит так, как это не работает на MainUIThread, он работает на AsyncTask, и я не использую –

Смежные вопросы