Necesito detectar cuándo tengo conectividad de red a través de WIFI. Qué difusión se envía para establecer que se ha realizado una conexión de red válida. Necesito validar que existe una conexión de red válida para HTTP. ¿Qué debo escuchar y qué pruebas adicionales debo hacer para saber que existe una conexión válida?
android
android-wifi
Androider
fuente
fuente
Respuestas:
Puede registrar un
BroadcastReceiver
para recibir una notificación cuando se establezca una conexión WiFi (o si la conexión cambió).Registra el
BroadcastReceiver
:Y luego en tu
BroadcastReceiver
hacer algo como esto:Para obtener más información, consulte la documentación para
BroadcastReceiver
yWifiManager
Por supuesto, debe verificar si el dispositivo ya está conectado a WiFi antes de esto.
EDITAR: Gracias a la prohibición de geoingeniería, aquí hay un método para verificar si el dispositivo ya está conectado:
fuente
private boolean isConnectedViaWifi() { ConnectivityManager connectivityManager = (ConnectivityManager) appObj.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); return mWifi.isConnected(); }
Lo mejor que me funcionó:
AndroidManifest
Clase BroadcastReceiver
Permisos
fuente
Para mi solo
WifiManager.NETWORK_STATE_CHANGED_ACTION
funciona.Registre un receptor de difusión:
y recibir:
fuente
La respuesta dada por el usuario @JPM y @usman es realmente muy útil. Funciona bien, pero en mi caso viene en
onReceive
múltiples ocasiones en mi caso 4 veces, por lo que mi código se ejecuta varias veces.Hago algunas modificaciones y las realizo según mi requerimiento y ahora solo viene 1 vez
Aquí está la clase de Java para Broadcast.
En AndroidManifest
fuente
Usted puede iniciar una conexión wifi si se le da al usuario una opción para anular el comportamiento normal de pedir cada vez.
Elijo usar tres métodos ...
Esta es una verificación rápida si hay una conexión a Internet, ya sea Wifi o CellData. Desde aquí puedes elegir qué acción quieres tomar. ¿Está en modo avión? También debe verificarse.
En un hilo separado. Establezco una variable IpAddress en = "" Y sondeo hasta que tenga una dirección IP válida.
Otro fragmento de código ... Si no está activado, actívelo (con permiso previo de los usuarios)
fuente
Para detectar el estado de la conexión WIFI, he usado CONNECTIVITY_ACTION de la clase ConnectivityManager, así que:
y desde su BroadCastReceiver:
ps: funciona bien para mí :)
fuente
Este código no requiere permiso en absoluto. Está restringido solo a los cambios de estado de conectividad de la red Wi-Fi (no se tiene en cuenta ninguna otra red). El receptor se publica de forma estática en el archivo AndroidManifest.xml y no necesita ser exportados, ya que será invocado por el sistema
protected broadcast
,NETWORK_STATE_CHANGED_ACTION
, en cada cambio de estado de la conectividad de red.Manifiesto de Android:
Clase BroadcastReceiver:
Permisos:
fuente
Aquí hay un ejemplo de mi código, que tiene en cuenta la preferencia de los usuarios de permitir solo comunicaciones cuando está conectado a Wifi.
Estoy llamando a este código desde dentro de un
IntentService
antes de intentar descargar cosas.Tenga en cuenta que
NetworkInfo
seránull
si no hay conexión de red de ningún tipo.fuente
Android O eliminó la posibilidad de recibir las transmisiones implícitas para un cambio de estado wifi. Entonces, si su aplicación está cerrada, no podrá recibirla. El nuevo
WorkManager
tiene la capacidad de ejecutarse cuando su aplicación está cerrada, por lo que he experimentado un poco con ella y parece funcionar bastante bien:Agregue esto a sus dependencias:
WifiConnectWorker.kt
MainActivity.kt
Tenga en cuenta que esto fue solo una prueba rápida para una notificación única. Hay más trabajo por hacer para que siempre se nos notifique cuando WiFi está encendido y apagado.
PD: Cuando la aplicación se cierra por la fuerza , el trabajador no se inicia, parece
WorkManager
que cancela las solicitudes en ese momento.fuente
Usé este código:
fuente
Tengo dos métodos para detectar la conexión WIFI que recibe el contexto de la aplicación:
1) mi viejo método
2) mi nuevo método (actualmente estoy usando este método):
fuente
Para todos aquellos que disfrutan de la transmisión CONNECTIVITY_CHANGE , tenga en cuenta que esto ya no se activa cuando la aplicación está en segundo plano en Android O.
https://developer.android.com/about/versions/o/background.html
fuente
1) También probé el enfoque de Broadcast Receiver aunque conozco CONNECTIVITY_ACTION / CONNECTIVITY_CHANGE está en desuso en API 28 y no se recomienda. También obligado a usar el registro explícito, escucha mientras la aplicación se esté ejecutando.
2) También probé Firebase Dispatcher que funciona pero no más allá de la aplicación eliminada.
3) La forma recomendada que se encuentra es WorkManager para garantizar la ejecución más allá del proceso finalizado y utilizando internamente registerNetworkRequest ()
El documento de Android mismo hace referencia a la mayor evidencia a favor del enfoque # 3 . Especialmente para aplicaciones en segundo plano.
Tambien aqui
Hasta ahora funciona bien para nosotros usando la solicitud de WorkManager periódico.
Actualización: Terminé escribiendo 2 publicaciones medianas de la serie al respecto.
fuente