Responder a atualizações de localização
Idioma: HTML | XAML

Responder a atualizações de localização (XAML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

Aprenda a receber atualizações de localização do usuário por um período de tempo. Este tópico usa exemplos de código, baseados no exemplo de geolocalização, para demonstrar pontos-chave. Para saber mais, baixe e execute o exemplo.

Mapa: como este tópico está relacionado aos outros? Veja:

Etapa 1: Verificar se a localização está habilitada

Para que seu aplicativo possa acessar a localização, é necessário habilitar Localização no dispositivo. No aplicativo Configurações, verifique se as seguintes configurações de privacidade de localização estão ativadas:

  • Localização deste dispositivo... está ativada (não aplicável no Windows 10 Mobile)
  • A configuração de serviços de localização, Localização, está ativada
  • Em Choose apps that can use your location, seu aplicativo está definido como ativado

Etapa 2: Habilitar o recurso de localização

Clique duas vezes em package.appxmanifest no Gerenciador de Soluções e selecione a guia Funcionalidades. Em seguida, selecione Localização na lista Funcionalidades. Isso adiciona a funcionalidade Location do dispositivo ao arquivo de manifesto do pacote.


  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Etapa 3: Solicitar acesso à localização do usuário

Solicite acesso à localização do usuário usando o método RequestAccessAsync.

Importante  No Windows 10, chame RequestAccessAsync antes de acessar a localização do usuário. Nesse momento, seu aplicativo deve estar em primeiro plano e RequestAccessAsync deve ser chamado do thread de IU. Até o usuário conceder ao seu aplicativo permissão para a localização, o aplicativo não pode acessar dados de localização.
 


using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();

O método RequestAccessAsync solicita ao usuário permissão para acessar sua localização. O usuário é solicitado apenas uma vez (por aplicativo). Após a primeira vez em que a permissão é concedida ou negada, esse método não solicita mais permissão. Para ajudar o usuário a alterar as permissões de localização depois que elas tiverem sido solicitadas, é recomendável fornecer um link para as configurações de localização, conforme demonstrado mais adiante neste tópico.

Etapa 4: Definir o intervalo de relatório e registrar-se para atualizações de localização

Neste exemplo, uma instrução switch é usada com accessStatus (do exemplo anterior) para atuar somente quando o acesso à localização é permitido. Se permitido, o código criará um objeto Geolocator, especificará o tipo de controle e registrará atualizações de localização.

O objeto Geolocator pode disparar o evento PositionChanged com base em uma alteração na posição (rastreamento baseado em distância ) ou uma mudança no momento (rastreamento baseado em período). Para o rastreamento baseado em distância, defina a propriedade MovementThreshold. Para o controle baseado em período, defina o ReportInterval. Se nenhuma estiver definida, uma posição será retornada a cada 1 segundo (equivalente a ReportInterval = 1000). Aqui, é usado um intervalo de relatório de 2 segundos.


switch (accessStatus)
{
    case GeolocationAccessStatus.Allowed:
        // Create Geolocator and define perodic-based tracking (2 second interval)
        _geolocator = new Geolocator { ReportInterval = 2000 };

        // Subscribe to PositionChanged event to get location updates
        _geolocator.PositionChanged += OnPositionChanged;

        // Subscribe to StatusChanged event to get updates of location status changes
        _geolocator.StatusChanged += OnStatusChanged;
                    
        _rootPage.NotifyUser("Waiting for update...", NotifyType.StatusMessage);
        LocationDisabledMessage.Visibility = Visibility.Collapsed;
        StartTrackingButton.IsEnabled = false;
        StopTrackingButton.IsEnabled = true;
        break;

    case GeolocationAccessStatus.Denied:
        _rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);
        LocationDisabledMessage.Visibility = Visibility.Visible;
        break;

    case GeolocationAccessStatus.Unspecified:
        _rootPage.NotifyUser("Unspecificed error!", NotifyType.ErrorMessage);
        LocationDisabledMessage.Visibility = Visibility.Collapsed;
        break;
}

Etapa 5: Manipular atualizações de localização

O objeto Geolocator dispara o evento PositionChanged para indicar que a localização do usuário mudou ou o tempo passou, dependendo de como você tiver configurado. Esse evento passa a localização correspondente por meio da propriedade Position do argumento (do tipo Geoposition). Nesse exemplo, o método não é chamado a partir do thread de interface do usuário, e o objeto Dispatcher invoca as alterações de interface do usuário.


using Windows.UI.Core;
...
async private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        _rootPage.NotifyUser("Location updated.", NotifyType.StatusMessage);
        UpdateLocationData(e.Position);
    });
}

Etapa 6: Manipular alterações em permissões de localização

O objeto Geolocator dispara o evento StatusChanged para indicar que as configurações de localização do usuário mudaram. Esse evento passa o status correspondente por meio da propriedade Status do argumento (do tipo PositionStatus). Mais uma vez, o método não é chamado a partir do thread de interface do usuário e o objeto Dispatcher invoca as alterações de interface do usuário.



using Windows.UI.Core;
...
async private void OnStatusChanged(Geolocator sender, StatusChangedEventArgs e)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        // Show the location setting message only if status is disabled.
        LocationDisabledMessage.Visibility = Visibility.Collapsed;

        switch (e.Status)
        {
            case PositionStatus.Ready:
                // Location platform is providing valid data.
                ScenarioOutput_Status.Text = "Ready";
                _rootPage.NotifyUser("Location platform is ready.", NotifyType.StatusMessage);
                break;

            case PositionStatus.Initializing:
                // Location platform is attempting to acquire a fix. 
                ScenarioOutput_Status.Text = "Initializing";
                _rootPage.NotifyUser("Location platform is attempting to obtain a position.", NotifyType.StatusMessage);
                break;

            case PositionStatus.NoData:
                // Location platform could not obtain location data.
                ScenarioOutput_Status.Text = "No data";
                _rootPage.NotifyUser("Not able to determine the location.", NotifyType.ErrorMessage);
                break;

            case PositionStatus.Disabled:
                // The permission to access location data is denied by the user or other policies.
                ScenarioOutput_Status.Text = "Disabled";
                _rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);

                // Show message to the user to go to location settings
                LocationDisabledMessage.Visibility = Visibility.Visible;

                // Clear cached location data if any
                UpdateLocationData(null);
                break;

            case PositionStatus.NotInitialized:
                // The location platform is not initialized. This indicates that the application 
                // has not made a request for location data.
                ScenarioOutput_Status.Text = "Not initialized";
                _rootPage.NotifyUser("No request for location is made yet.", NotifyType.StatusMessage);
                break;

            case PositionStatus.NotAvailable:
                // The location platform is not available on this version of the OS.
                ScenarioOutput_Status.Text = "Not available";
                _rootPage.NotifyUser("Location is not available on this version of the OS.", NotifyType.ErrorMessage);
                break;

            default:
                ScenarioOutput_Status.Text = "Unknown";
                _rootPage.NotifyUser(string.Empty, NotifyType.StatusMessage);
                break;
        }
    });
}

Etapa 7: Ajudar o usuário a alterar configurações de localização

Se as configurações de localização não permitirem que seu aplicativo acesse a localização do usuário, é recomendável fornecer um link conveniente para as configurações de privacidade de localização no aplicativo Configurações. Neste exemplo, um controle Hyperlink é usado navegar até o URI ms-settings:privacy-location.


<!--Set Visibility to Visible when access to location is denied -->  
<TextBlock x:Name="LocationDisabledMessage" FontStyle="Italic" 
                 Visibility="Collapsed" Margin="0,15,0,0" TextWrapping="Wrap" >
          <Run Text="This app is not able to access Location. Go to " />
              <Hyperlink NavigateUri="ms-settings:privacy-location">
                  <Run Text="Settings" />
              </Hyperlink>
          <Run Text=" to check the location privacy settings."/>
</TextBlock>

Como alternativa, seu aplicativo pode chamar o método LaunchUriAsync para iniciar o aplicativo Configurações do código. Para obter mais informações, consulte Como iniciar o aplicativo Configurações.


using Windows.System;
...
bool result = await Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));

Tópicos relacionados

Exemplo de geolocalização do Windows 10
Exemplo de geolocalização do Windows 8.1
Exemplos do SDK do Bing Mapas
Windows.Devices.Geolocation
Diretrizes de uso para dispositivos sensíveis

 

 

Mostrar:
© 2017 Microsoft