¿Cómo detectar si una red está configurada como un hotspot móvil en Android?
A partir de Android 4.1, su dispositivo puede detectar si está conectado a un hotspot móvil (dado que el hotspot móvil también ejecuta Android 4.1 o superior). Además, tiene la opción de marcar redes como puntos de acceso móviles (en el menú Configuración / Uso de datos / Desbordamiento / Puntos de acceso móviles).
Pero ¿cómo puedo detectar esto como un usuario-me refería a desarrollador? No se almacena en la WifiConfiguration, así que ¿dónde está?
- Quiero obtener tiempo de la red GSM
- Programáticamente obtener conexión Wifi contraseña?
- Excepción de lectura Wifi / 3G Estado
- FIXED: No se puede conectar a adb a través de wifi
- Cómo obtener la dirección MAC de la interfaz WIFI en android?
Algún contexto: Quiero crear una herramienta sencilla para Android que compruebe si está conectado a una red que usted o Android han marcado como un hotspot móvil. Si es así, comprobará si no hay otras redes (no hotspot) disponibles. Si es así, debería conectarse a estas otras redes ya que éstas deberían ser mucho más rápidas y no tener límite de datos. ¿Por qué? Porque mis teléfonos y tabletas se conectan a los hotspots (móviles) con bastante frecuencia, incluso cuando una red mejor está disponible.
Aquí hay un pseudo código de lo que estoy buscando:
// Check if android has detected mobile hotspot WifiManager wifiMgr = getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiMgr .getConnectionInfo(); boolean isMobileHotspot = wifiInfo.isMobileHotspot;
ACTUALIZACIÓN 3 de julio de 2014
Bueno, la respuesta de Matiash es buena, pero ConnectivityManager.isActiveNetworkMetered () sólo devolverá el valor de la red actual. Lo necesito, así que me ayudó a lo largo, pero me lleva a la siguiente parte de mi herramienta / aplicación:
SI el dispositivo está conectado a un hotspot móvil (o una "red medida" como lo llama Android) quiero comprobar si alguno de los puntos de acceso cercanos es una opción mejor. Por lo tanto, necesito saber si alguno de los AP conocidos (WifiManager.getConfiguredNetworks ()) también está marcado como tal antes de conectarme a él …
Tengo una List<ScanResult>
y una List<WifiConfiguration>
, parece que ninguno de ellos tiene esta información.
Lo que me lleva de nuevo a mi pregunta inicial: ¿Existe alguna manera de recuperar los Hotspots móviles (configurados por Android y / o usuario) bajo Uso de datos? Y esta vez me refiero a todos ellos.
ACTUALIZACIÓN Jul 7th 2014
He publicado una solicitud de característica en el AOSP Issue Tracker para el acceso (readonly) a NetworkPolicyManager. Plz votar en ella aquí: https://code.google.com/p/android/issues/detail?id=73206&thanks=73206&ts=1404719243
- WifiConfiguration habilita la red en Lollipop
- Resultados de escaneo Wifi receptor de difusión no funciona
- Compartir credenciales Wifi a través de etiqueta NFC sin aplicaciones especiales
- Habilitación de WiFi en el emulador de Android
- ¿Cómo funciona la aplicación "SHAREit" Android funciona técnicamente?
- Android, cómo anular la comprobación de conectividad a Internet al conectarse a la red wifi?
- Android: Determinar el tipo de seguridad de las redes wifi en el rango (sin conectarse a ellos)
- ¿Dónde puedo obtener un proyecto de aplicación Android Wi-Fi Direct demo para ADT?
Puede acceder a esta información llamando a ConnectivityManager.isActiveNetworkMetered()
.
Esto devolverá si la conexión activa es un hotspot (como se define en Uso de datos -> Hotspots móviles).
Sobre la segunda parte, lo siento, pero no creo que sea posible. La bandera no es pública, e incluso si obtienes el objeto que se podría utilizar para recuperarlo ( android.net.NetworkPolicyManager
) por reflexión:
Object npm = Class.forName("android.net.NetworkPolicyManager").getDeclaredMethod("from", Context.class).invoke(null, this); Object policies = npm.getClass().getDeclaredMethod("getNetworkPolicies").invoke(npm);
getNetworkPolicies()
a getNetworkPolicies()
requiere el permiso MANAGE_NETWORK_POLICY
, que no puede ser obtenido por aplicaciones que no son del sistema, ya que tiene un nivel de protección "firma".
Espero ser probado incorrecto sin embargo. 🙂 Tal vez mirando el código fuente de la actividad de Android que gestiona esta información ( https://github.com/android/platform_packages_apps_settings/blob/master/src/com/android/settings/net/DataUsageMeteredSettings.java ), en particular El método buildWifiPref()
, proporcionará alguna pista.
No sé si lo que quieres es posible, pero puedes comprobar si tu dispositivo está conectado a una red comprobando la dirección IP. Puede usar la herramienta a continuación para ver si tiene ip y debe saber si está conectado a una red o no.
public static Boolean check_connection(final Context _context) { boolean connected; ConnectivityManager conectivtyManager = (ConnectivityManager) _context .getSystemService(Context.CONNECTIVITY_SERVICE); if (conectivtyManager.getActiveNetworkInfo() != null && conectivtyManager.getActiveNetworkInfo().isAvailable() && conectivtyManager.getActiveNetworkInfo().isConnected()) { connected = true; } else { connected = false; } return connected; }
- ¿Cómo mostrar el estado de la barra de progreso por porcentaje mientras se suben los datos de json?
- Archivo de rastreo de Android creado pero con cero bytes de largo