Wie erkennt man den Netzwerkverbindungstyp unter Android?
Ist es vorbei ConnectivityManager.getActiveNetworkInfo().getType()
und ist die Antwort auf Wifi und Mobile beschränkt?
quelle
Wie erkennt man den Netzwerkverbindungstyp unter Android?
Ist es vorbei ConnectivityManager.getActiveNetworkInfo().getType()
und ist die Antwort auf Wifi und Mobile beschränkt?
Wenn das Problem darin besteht, festzustellen, ob das Netzwerk des Telefons verbunden und schnell genug ist, um Ihre Anforderungen zu erfüllen, müssen Sie alle von zurückgegebenen Netzwerktypen verarbeiten getSubType()
.
Ich brauchte ein oder zwei Stunden, um diese Klasse zu recherchieren und zu schreiben, um genau das zu tun, und ich dachte, ich würde sie mit anderen teilen, die sie vielleicht nützlich finden.
Hier ist ein Kern der Klasse , damit Sie sie teilen und bearbeiten können.
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;
}
}
}
Stellen Sie außerdem sicher, dass Sie diese Berechtigung zu AndroidManifest.xml hinzufügen
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
Quellen für Netzwerkgeschwindigkeiten sind Wikipedia und http://3gstore.com/page/78_what_is_evdo_mobile_broadband.html
public static final int
. Sie müssen also nicht den "Hack" machen. Der Compiler zielt nur auf das neueste SDK ab und kompiliert die realen Werte (Ganzzahlen), auf die er verweist (nicht ihre Instanzen), in Bytecodes.targetSdkVersion
Einstellung verwenden sollte. Ich habe den Beitrag bearbeitet, um den Hack zu entfernen, danke.Um genauere (und benutzerfreundlichere) Informationen zum Verbindungstyp zu erhalten. Sie können diesen Code verwenden (abgeleitet von einer @ hide-Methode in TelephonyManager.java ).
Diese Methode gibt einen String zurück, der den aktuellen Verbindungstyp beschreibt.
dh eines von: "WIFI", "2G", "3G", "4G", "5G", "-" (nicht verbunden) oder "?" (Unbekannt)
Anmerkung: Für diesen Code ist API 25+ erforderlich. Sie können jedoch ältere Versionen problemlos unterstützen, indem Sie int anstelle von const verwenden. (Siehe Kommentare im Code).
quelle
Sie können getSubtype () für weitere Details verwenden. Schauen Sie sich Folie 9 hier an: http://dl.google.com/io/2009/pres/W_0300_CodingforLife-BatteryLifeThatIs.pdf
Schauen Sie sich auch Emils Antwort an, um mehr darüber zu erfahren.
quelle
@ Emils Antwort oben ist brillant.
Kleiner Zusatz: Idealerweise sollten wir TelephonyManager verwenden, um Netzwerktypen zu erkennen. Also sollte das Obige stattdessen lauten:
quelle
Die Antwort von Emil Davtyan ist gut, aber es wurden Netzwerktypen hinzugefügt, die in seiner Antwort nicht berücksichtigt werden. So
isConnectionFast(int type, int subType)
kann return false , wenn es wahr sein sollte.Hier ist eine modifizierte Klasse, die Reflektion verwendet, um hinzugefügte Netzwerktypen in späteren APIs zu berücksichtigen:
quelle
if (NetworkUtils.isWifiConnection(this) { /* do stuff */ }
Sie können eine benutzerdefinierte Methode erstellen, um diese Aufgabe auszuführen.
quelle
Zusätzlich zu Emils beeindruckender Antwort möchte ich noch eine weitere Methode hinzufügen, um zu überprüfen, ob Sie tatsächlich über einen Internetzugang verfügen, da der Datensatz auf Ihrem Telefon möglicherweise deaktiviert ist.
Beachten Sie, dass dies nur zur Überprüfung dient, ob eine Mobilfunkdatenverbindung besteht, und false zurückgibt, wenn Sie eine WLAN-Verbindung haben, da die Mobilfunkdaten ausgeschaltet sind, wenn eine WLAN-Verbindung besteht.
quelle
Sie können dies überprüfen
quelle
sollte Ihnen den Netzwerknamen geben
quelle
Derzeit werden nur MOBILE und WIFI unterstützt. Schauen Sie sich die vom Menschen lesbare Schriftfunktion an .
quelle
Sie können dies versuchen:
quelle
Ermitteln Sie, welcher Netzwerktyp vorhanden ist, und ermitteln Sie den booleschen Wert von isconnected oder verwenden Sie ihn nicht unter dem Snippet
Verwenden Sie diese Option, nachdem die Klasse den Kontext übergeben hat, in dem Sie den Netzwerkstatus wie Netzwerktyp, schnelles Netzwerk usw. erhalten.
quelle
Unten sehen Sie verschiedene Möglichkeiten, dies zu tun. Beachten Sie, dass die ConnectivityManager-Klasse viele Netzwerktypen enthält. Wenn API> = 21 ist, können Sie auch die Netzwerktypen in der NetworkCapabilities-Klasse überprüfen.
quelle