Desenvolvimento De Aplicativos Windows Phone: Geofences
Introdução
Dando prosseguimento a nossa série de tutoriais sobre desenvolvimento de aplicativos para a plataforma Windows Phone iremos tratar de Geofences uma função implementada a partir da versão 8.1. Geofences representam áreas geográficas e são capazes de disparar eventos. O Windows Phone 8.1 nos permite receber e tratar os eventos de entrada e saída de uma área bem como a remoção do geofence em questão.
Neste post ensinaremos o básico de como criar e monitorar as geofences, além de tratar os eventos que elas irão disparar. Como exemplo vamos fazer um aplicativo simples, que informa quando o usuário se aproxima dos prédios da UFOP selecionados por ele.
Inicialização
Antes de mais nada é necessário declarar que o aplicativo tem a capacidade de acessar a localização do dispositivo. Isso deve ser feito adicionando a capability ID_CAP_LOCATION ao arquivo WMAppManifest.xml do projeto. Após isso é necessário que o usuário autorize a aplicação a utilizar a localização do dispositivo. Podemos fazer isso chamando o método a seguir na inicialização do aplicativo.
[sourcecode language=”csharp” wraplines=”false” collapse=”false”]
private async Task initializeGeofence()
{
Geolocator geoLocator = new Geolocator();
CancellationToken token = (new CancellationTokenSource()).Token;
try
{
Geoposition localization = await geoLocator.GetGeopositionAsync(TimeSpan.FromMinutes(3), TimeSpan.FromSeconds(30)).AsTask(token);
}
catch (Exception e)
{
throw e;
}
}
[/sourcecode]
Essa função instancia um Geolocator, classe responsável por determinar a posição do dispositivo, e um CancellationToken, que juntos são usados para pedir a permissão do usuário para acessar a localização. Poderiamos solicitar a localização de forma assíncrona, mas usamos o modificador await para garantir que o acesso a localização já esteja liberado na hora de criar as geofences e monitorar as mesmas.
Criação de geofences
Para criar uma geofence será necessário definir o id da mesma, a área geográfica que ela monitora e quais os eventos ela irá disparar. Atualmente o único GeoShape implementado é o GeoCircle, que é dado por um ponto geográfico e um raio ao redor do mesmo. Iremos monitorar uma área com raio de 400 metros ao redor do ponto estipulado como centro de cada prédio e os eventos de entrada e saída dessa área. Também devemos monitorar o evendo de remoção do geoshape pra tratar quando o usuário retira a seleção de dado prédio.
[sourcecode language=”csharp” wraplines=”false” collapse=”false”]
private void isEnabled_Checked(object sender, RoutedEventArgs e)
{
GeoPlaceItemVM item = (Lista.SelectedItem as GeoPlaceItemVM);
if (item != null)
{
BasicGeoposition position = new BasicGeoposition();
position.Latitude = item.Latitude;
position.Longitude = item.Longitude;
GeofenceMonitor geofenceMonitor = GeofenceMonitor.Current;
Geofence geofence = new Geofence(item.Id + "", new Geocircle(position, RADIUS), MonitoredGeofenceStates.Entered | MonitoredGeofenceStates.Exited | MonitoredGeofenceStates.Removed, false);
geofenceMonitor.Geofences.Add(geofence);
}
}
[/sourcecode]
No trecho de código acima podemos ver a função que trata a seleção de um item na lista de prédios da UFOP. Essa função cria um geofence a partir dos dados do item e adiciona ele no GeofenceMonitor. GeofenceMonitor é uma classe singleton responsável por monitorar todas as geofences criadas pelo aplicativo.
Monitorando as geofences.
Para monitorarmos as geofences devemos primeiro adicionar ao GeofenceMonitor qual é a função que ele deve executar quando um geofence dispara um evento, ou muda de estado. Para fazer esse monitoramento devemos adicionar as duas linhas de código abaixo na função initializeGeofence() que definimos anteriormente.
[sourcecode language=”csharp” wraplines=”false” collapse=”false”]
GeofenceMonitor geofenceMonitor = GeofenceMonitor.Current;
geofenceMonitor.GeofenceStateChanged += geofenceMonitor_GeofenceStateChanged;
}
[/sourcecode]
O código abaixo é responsável por tratar os eventos disparados pelos geofences. Para isso ele percorre o vetor de Reports verificando os novos estados dos geofences. Nessa função do aplicativo de exemplo nós exibimos uma mensagem ao usuário informando que o mesmo entrou ou saiu de um dado geofence de acordo com o evento recebido. função NotifyUser citada no código é responsável somente por exibir um MessageBox pro usuário contendo a string dada. Ela é necessária pois essa função roda em uma thread diferente da thread que manipula a UI.
[sourcecode language=”csharp” wraplines=”false” collapse=”false”]
void geofenceMonitor_GeofenceStateChanged(GeofenceMonitor sender, object args)
{
var reports = sender.ReadReports();
foreach (var report in reports)
{
GeofenceState state = report.NewState;
Geofence geofence = report.Geofence;
// Entrada no Geofence
if (state == GeofenceState.Entered)
{
MainPage.NotifyUser("Você entrou na área do: " + geofence.Id);
}
// Saida do Geofence
if (state == GeofenceState.Exited)
{
MainPage.NotifyUser("Você saiu da área do: " + geofence.Id);
}
// Remoção do Geofence
if (state == GeofenceState.Removed)
{
GeofenceMonitor.Current.Geofences.Remove(geofence);
}
}
}
[/sourcecode]
Esse post mostra o necessário para aprender o básico de geofence. Outras modificações podem ser feitas, tal como permitir que o aplicativo faça o monitoramento de geofences em background, sem a necessidade do aplicativo estar aberto. Também é possível disparar o evento depois de um tempo determinado que entra ou sai da área do geofence além de criar geofences que só são disparadas uma vez. Estas e outras opções podem ser facilmente implementadas com uma rápida consulta a API de Geofencing do Windows Phone.