Eventos

[Xamarin] ¿Cómo saber si tengo conexión en Xamarin.Android?

Es importante conocer el estado de conexión de nuestra aplicación para no hacer consultas que pueden resultar en fallas, así como para tener la oportunidad de mostrar al usuario el mensaje adecuado para que no crea que hay una falla en la aplicación cuando el verdadero problema es uno de conectividad.

En caso de Xamarin.Android, lo primero que debemos hacer es agregar los permisos adecuados al AndroidManifest.xml.


Seguido de ello podemos hacer lo siguiente para validar si tenemos algun tipo de conexión:

ConnectivityManager connectivityManager = (ConnectivityManager)GetSystemService(Context.ConnectivityService);
NetworkInfo activeConnection = connectivityManager.ActiveNetworkInfo;
bool isOnline = (activeConnection != null) && activeConnection.IsConnected;
if (!isOnline)
Toast.MakeText(this, "Por favor, segurese de estar conectado a internet y vuelva a intentarlo.", ToastLength.Long).Show();
view raw snippet1.cs hosted with ❤ by GitHub
O lo siguiente para saber si tenemos conexión con algún host en específico.

try
{
URL myUrl = new URL("https://reachsos.com");
URLConnection connection = myUrl.OpenConnection();
connection.ConnectTimeout = 3000;
await connection.ConnectAsync();
}
catch (Exception)
{
Toast.MakeText(this, "Tenemos problemas para contactar con el servidor.", ToastLength.Long).Show();
}
view raw snippet2.cs hosted with ❤ by GitHub
Si son instrucciones recurrentes en nuestra aplicación, deberíamos encapsularlas y ponerlas en una clase llamada ConnectivityService.cs por ejemplo.

using Android.App;
using Android.Content;
using Android.Net;
using Java.Net;
using System;
using System.Threading.Tasks;
namespace blog.epicalsoft.com
{
public class ConnectivityService
{
public static ConnectivityService Instance = new ConnectivityService();
private ConnectivityService()
{
}
public bool IsConnected
{
get
{
ConnectivityManager connectivityManager = (ConnectivityManager)Application.Context.GetSystemService(Context.ConnectivityService);
NetworkInfo activeConnection = connectivityManager.ActiveNetworkInfo;
return (activeConnection != null) && activeConnection.IsConnected;
}
}
public async Task<bool> IsRemoteReachable(string url)
{
try
{
URL myUrl = new URL(url);
URLConnection connection = myUrl.OpenConnection();
connection.ConnectTimeout = 3000;
await connection.ConnectAsync();
return true;
}
catch (Exception)
{
return false;
}
}
}
}

Para mayor info acerca de ConnectivityManager, véase la documentación oficial: https://developer.xamarin.com/api/type/Android.Net.ConnectivityManager/

No hay comentarios.:

Publicar un comentario

Epicalsoft — Superheroic Software Development Blog Designed by Templateism Copyright © 2014

Con tecnología de Blogger.