¿Cómo se detecta el tipo de conexión de red en Android?
¿Ya pasó ConnectivityManager.getActiveNetworkInfo().getType()
y la respuesta se limita a Wifi y dispositivos móviles?
fuente
¿Cómo se detecta el tipo de conexión de red en Android?
¿Ya pasó ConnectivityManager.getActiveNetworkInfo().getType()
y la respuesta se limita a Wifi y dispositivos móviles?
Si el problema es encontrar si la red del teléfono está conectada y es lo suficientemente rápida como para satisfacer sus demandas, debe manejar todos los tipos de red devueltos por getSubType()
.
Me llevó una o dos horas investigar y escribir esta clase para hacer exactamente eso, y pensé en compartirla con otros que pudieran encontrarla útil.
Aquí hay un resumen de la clase , por lo que puede bifurcarlo y editarlo.
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;
}
}
}
También asegúrese de agregar este permiso a su AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
Las fuentes para velocidades de red incluyen wikipedia y http://3gstore.com/page/78_what_is_evdo_mobile_broadband.html
public static final int
. Entonces no necesitas hacer el "hack". Solo apunte al SDK más nuevo, el compilador compila los valores reales (enteros) a los que apuntan (no sus instancias) en códigos de bytes.targetSdkVersion
configuración. Edité la publicación para eliminar el truco, gracias.Para obtener una información más precisa (y fácil de usar) sobre el tipo de conexión. Puede usar este código (derivado de un método @hide en TelephonyManager.java ).
Este método devuelve una cadena que describe el tipo de conexión actual.
es decir, uno de: "WIFI", "2G", "3G", "4G", "5G", "-" (no conectado) o "?" (desconocido)
Observación: este código requiere API 25+, pero puede admitir fácilmente versiones anteriores utilizando int en lugar de const. (Ver comentarios en el código).
fuente
Puede usar getSubtype () para obtener más detalles. Consulte la diapositiva 9 aquí: http://dl.google.com/io/2009/pres/W_0300_CodingforLife-BatteryLifeThatIs.pdf
Además, consulte la respuesta de Emil para una inmersión más detallada en esto.
fuente
La respuesta de @ Emil arriba es brillante.
Pequeña adición: idealmente deberíamos usar TelephonyManager para detectar tipos de red. Por lo tanto, lo anterior debería leer:
fuente
La respuesta de Emil Davtyan es buena, pero se han agregado tipos de red que no se tienen en cuenta en su respuesta. Por lo tanto,
isConnectionFast(int type, int subType)
puede devolver falso cuando debería ser cierto.Aquí hay una clase modificada que utiliza la reflexión para dar cuenta de los tipos de red agregados en las API posteriores:
fuente
if (NetworkUtils.isWifiConnection(this) { /* do stuff */ }
Puede hacer un método personalizado para realizar esta tarea.
fuente
Además de la impresionante respuesta de Emil, me gustaría agregar un método más, para verificar si realmente tiene acceso a Internet, ya que podría tener los datos desactivados en su teléfono.
Tenga en cuenta que esto es solo para verificar si hay una conexión de datos móviles y devolverá falso si tiene WiFi conectado, ya que los datos celulares están apagados cuando WiFi está conectado.
fuente
Puedes comprobar así
fuente
debería conseguirte el nombre de la red
fuente
Actualmente, solo se admite MÓVIL y WIFI. Eche un vistazo y la función de tipo legible por humanos .
fuente
Puedes probar esto:
fuente
Detecte el tipo de red y obtenga el valor booleano de isconnected o no use debajo del fragmento
use esto después de que la clase pase el contexto, obtendrá el estado de la red como tipo de red, red rápida, etc.
fuente
A continuación se muestran diferentes formas de hacerlo. Tenga en cuenta que hay muchos tipos de red en la clase ConnectivityManager. Además, si API> = 21, puede verificar los tipos de red en la clase NetworkCapabilities.
fuente