2012-10-22 11 views
19

Muszę wykryć w Androidzie, jeśli istnieje połączenie Wifi lub 3G (lub 3G+) lub EDGE w systemie Android. Gdy istnieje połączenie, mogę wysyłać zdjęcia do serwera, a kiedy jest to tylko połączenie EDGE, aby nie wysyłać ich na serwer.Wykryj, czy połączenie jest wifi, 3G lub EDGE w systemie Android?

Widziałem, że łączność Wi-Fi można wykryć za pomocą ConnectivityManager.TYPE_WIFI, a przy ConnectivityManager.TYPE_MOBILE i TelephonyManager.NETWORK_TYPE_EDGE można wykryć połączenie EDGE. Ale jak można wykryć 3G lub 3G +?

Z góry dziękuję.

+0

Sprawdź tę odpowiedź. To może pomóc użytkownikowi http://stackoverflow.com/questions/2802472/detect-network-connection-type-on-android/8548926#8548926 –

Odpowiedz

1
public class WifiState { 

    Context context; 

    public WifiState(Context context) { 
     this.context = context; 
    } 

    public void haveNetworkConnection() { 

     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) context 
       .getSystemService(context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 

     } 
     if (haveConnectedWifi == false && haveConnectedMobile == false) { 

      //do something to handle if wifi & mobiledata is disabled 

     } else { 
       //do something else.. 
     } 
    } 
+0

przypadku MOBILE oznacza, że ​​jest podłączony 3G ?? – Gabrielle

+0

zgodnie z dokumentacją; Tak. http://developer.android.com/reference/android/net/ConnectivityManager.html#TYPE_MOBILE –

37

https://gist.github.com/emil2k/5130324

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

/** 
* Check device's network connectivity and speed 
* @author emil http://stackoverflow.com/users/220710/emil 
* 
*/ 
public class Connectivity 
{ 
    /** 
    * Get the network info 
    * @param context 
    * @return 
    */ 
    public static NetworkInfo getNetworkInfo(Context context){ 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     return cm.getActiveNetworkInfo(); 
    } 

    /** 
    * Check if there is any connectivity 
    * @param context 
    * @return 
    */ 
    public static boolean isConnected(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected()); 
    } 

    /** 
    * Check if there is any connectivity to a Wifi network 
    * @param context 
    * @return 
    */ 
    public static boolean isConnectedWifi(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); 
    } 

    /** 
    * Check if there is any connectivity to a mobile network 
    * @param context 
    * @return 
    */ 
    public static boolean isConnectedMobile(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE); 
    } 

    /** 
    * Check if there is fast connectivity 
    * @param context 
    * @return 
    */ 
    public static boolean isConnectedFast(Context context){ 
     NetworkInfo info = Connectivity.getNetworkInfo(context); 
     return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype())); 
    } 

    /** 
    * Check if the connection is fast 
    * @param type 
    * @param subType 
    * @return 
    */ 
    public static boolean isConnectionFast(int type, int subType){ 
     if(type==ConnectivityManager.TYPE_WIFI){ 
      return true; 
     }else if(type==ConnectivityManager.TYPE_MOBILE){ 
      switch(subType){ 
       case TelephonyManager.NETWORK_TYPE_1xRTT: 
        return false; // ~ 50-100 kbps 
       case TelephonyManager.NETWORK_TYPE_CDMA: 
        return false; // ~ 14-64 kbps 
       case TelephonyManager.NETWORK_TYPE_EDGE: 
        return false; // ~ 50-100 kbps 
       case TelephonyManager.NETWORK_TYPE_EVDO_0: 
        return true; // ~ 400-1000 kbps 
       case TelephonyManager.NETWORK_TYPE_EVDO_A: 
        return true; // ~ 600-1400 kbps 
       case TelephonyManager.NETWORK_TYPE_GPRS: 
        return false; // ~ 100 kbps 
       case TelephonyManager.NETWORK_TYPE_HSDPA: 
        return true; // ~ 2-14 Mbps 
       case TelephonyManager.NETWORK_TYPE_HSPA: 
        return true; // ~ 700-1700 kbps 
       case TelephonyManager.NETWORK_TYPE_HSUPA: 
        return true; // ~ 1-23 Mbps 
       case TelephonyManager.NETWORK_TYPE_UMTS: 
        return true; // ~ 400-7000 kbps 
      /* 
      * Above API level 7, make sure to set android:targetSdkVersion 
      * to appropriate level to use these 
      */ 
       case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 
        return true; // ~ 1-2 Mbps 
       case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 
        return true; // ~ 5 Mbps 
       case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 
        return true; // ~ 10-20 Mbps 
       case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 
        return false; // ~25 kbps 
       case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 
        return true; // ~ 10+ Mbps 
       // Unknown 
       case TelephonyManager.NETWORK_TYPE_UNKNOWN: 
       default: 
        return false; 
      } 
     }else{ 
      return false; 
     } 
    } 
} 
-1

najpierw uzyskać odwołanie do ConnectivityManager a następnie check the Wifi and 3G status urządzenia. Będziesz potrzebować uprawnienia ACCESS_NETWORK_STATE do korzystania z tej usługi.

ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    NetworkInfo mMobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    if (mWifi.isAvailable() == true) { 
     return "Connected to WiFi"; 
    } else if (mMobile.isAvailable() == true) { 
     return "Connected to Mobile Network"; 
    } else return "No internet Connection" 
Powiązane problemy