Jak wykrywasz typ połączenia sieciowego na Androidzie?
Czy to już ConnectivityManager.getActiveNetworkInfo().getType()
koniec i czy odpowiedź ogranicza się do Wi-Fi i urządzeń mobilnych?
źródło
Jak wykrywasz typ połączenia sieciowego na Androidzie?
Czy to już ConnectivityManager.getActiveNetworkInfo().getType()
koniec i czy odpowiedź ogranicza się do Wi-Fi i urządzeń mobilnych?
Jeśli problemem jest ustalenie, czy sieć telefonu jest podłączona i wystarczająco szybka, aby spełnić Twoje wymagania, musisz obsłużyć wszystkie typy sieci zwrócone przez getSubType()
.
Zajęło mi godzinę lub dwie, aby zbadać i napisać tę klasę, aby zrobić dokładnie to, i pomyślałem, że podzielę się nią z innymi, którzy mogą uznać ją za przydatną.
Oto Istota klasy , więc możesz ją rozwidlić i edytować.
package com.emil.android.util;
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;
}
}
}
Pamiętaj również, aby dodać to uprawnienie do pliku AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
Źródła prędkości sieci obejmują wikipedię i http://3gstore.com/page/78_what_is_evdo_mobile_broadband.html
public static final int
. Więc nie musisz robić „hacka”. Po prostu celuj w najnowszy zestaw SDK, kompilator kompiluje rzeczywiste wartości (liczby całkowite), które wskazują (nie ich instancje) do kodów bajtowych.targetSdkVersion
ustawienia. Zredagowałem post, aby usunąć włamanie, dzięki.Aby uzyskać bardziej precyzyjne (i przyjazne dla użytkownika) informacje o typie połączenia. Możesz użyć tego kodu (pochodzącego z metody @hide w TelephonyManager.java ).
Ta metoda zwraca ciąg opisujący bieżący typ połączenia.
tzn. jeden z: „WIFI”, „2G”, „3G”, „4G”, „5G”, „-” (niepodłączony) lub „?” (nieznany)
Uwaga: Ten kod wymaga API 25+, ale możesz z łatwością obsługiwać starsze wersje, używając int zamiast const. (Patrz komentarze w kodzie).
źródło
Aby uzyskać więcej informacji, możesz użyć getSubtype (). Sprawdź slajd 9 tutaj: http://dl.google.com/io/2009/pres/W_0300_CodingforLife-BatteryLifeThatIs.pdf
Sprawdź również odpowiedź Emila, aby uzyskać bardziej szczegółowe informacje na ten temat.
źródło
@ Odpowiedź Emila powyżej jest genialna.
Mały dodatek: idealnie powinniśmy używać TelephonyManager do wykrywania typów sieci. Dlatego powyższe powinno brzmieć:
źródło
Odpowiedź Emila Davtyana jest dobra, ale dodano typy sieci, które nie są uwzględnione w jego odpowiedzi.
isConnectionFast(int type, int subType)
Może więc zwrócić wartość false, gdy powinna być prawdziwa.Oto zmodyfikowana klasa, która używa refleksji do uwzględnienia dodanych typów sieci w późniejszych interfejsach API:
źródło
if (NetworkUtils.isWifiConnection(this) { /* do stuff */ }
Możesz wykonać niestandardową metodę wykonania tego zadania.
źródło
Oprócz niesamowitej odpowiedzi Emila chciałbym dodać jeszcze jedną metodę, aby sprawdzić, czy faktycznie masz dostęp do Internetu, ponieważ możesz wyłączyć dane w telefonie.
Pamiętaj, że służy to tylko sprawdzeniu, czy istnieje komórkowe połączenie danych i zwróci false, jeśli masz podłączone WiFi, ponieważ dane komórkowe są wyłączone, gdy WiFi jest podłączone.
źródło
Możesz to sprawdzić w ten sposób
źródło
powinien dostać nazwę sieci
źródło
Obecnie obsługiwane są tylko MOBILE i WIFI. Spójrz i funkcja typu czytelna dla człowieka .
źródło
Możesz spróbować:
źródło
Wykryj, jaki typ sieci i uzyskanie wartości logicznej dla isconnected lub nie używaj poniżej fragmentu kodu
użyj tego po przejściu przez klasę, w którym uzyskasz status sieci, taki jak typ sieci, szybka sieć itp.
źródło
Poniżej pokazano różne sposoby na zrobienie tego. Należy pamiętać, że w klasie ConnectivityManager istnieje wiele typów sieci. Ponadto, jeśli API> = 21, możesz sprawdzić typy sieci w klasie NetworkCapabilities.
źródło