¿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á?

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

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; } 
  • ¿Es posible conectar dos o más grupos WiFi Direct?
  • Cómo evitar el retraso en los mensajes de GCM de Android / cambio de latidos del corazón
  • Android: detecta si Wifi requiere acceso al navegador
  • Obtener la intensidad de la señal WiFi de la red conectada
  • Conectar a wifi específico a veces falla en android
  • Android WifiManager El subproceso nunca se cierra
  • Android: Cómo detectar si un dispositivo es WiFi o WiFi + Celular
  • Cómo imprimir datos desde la aplicación de Android a la impresora WIFI?
  • Cómo obtener la ubicación del archivo de configuración wifi en android
  • Cómo obtener el IP del hotspot wifi en Android?
  • ¿Es posible intercambiar mensajes entre 2 dispositivos Android a través de wifi?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.