Dê vida ao seu aplicativo com localização e sensores

Blog do desenvolvedor de aplicativos do Windows 8

Ideias sobre a criação de aplicativos com o estilo Metro para o Windows 8, da equipe de engenharia do Windows 8

Dê vida ao seu aplicativo com localização e sensores

  • Comments 0

Se estiver desenvolvendo um aplicativo para tablets ou conversíveis com Windows 8, você terá acesso a serviços avançados de hardware e software para sensores e localização. Utilizando esses recursos de hardware, você pode agregar valor aos seus aplicativos e também torná-los interessantes e úteis.

Imagine um aplicativo que carrega automaticamente um ambiente 3D de acordo com a localização do usuário e permite navegar em 3D (panorama, inclinação) quando se movimenta o tablet em um espaço 3D. As imagens mostram um aplicativo de panorama, o Photosynth, que utiliza fusão de sensores para permitir manipulações naturais entre a orientação do dispositivo e a visão panorâmica do Photosynth. A fusão de sensores combina os resultados de um acelerômetro, um giroscópio e um magnetômetro para oferecer uma experiência de rotação melhor do que a de qualquer um desses sensores sozinhos e que é exposta por meio do tipo de tempo de execução Windows.Devices.Sensors.OrientationSensor.

Quando o usuário mantém o nível do dispositivo, ele tem acesso a uma visão direta do panorama do Photosynth:

Imagem de Paris direta, Copyright Felipe Garchet/360 Cities

Quando o usuário inclina o dispositivo para cima, a visão panorâmica também se inclina para cima:

Imagem de Paris voltada para cima, Copyright Felipe Garchet/360 Cities

Os mesmos tipos de manipulações ocorrem quando o usuário movimenta o dispositivo para esquerda ou para a direita. É como se a câmera no modo panorâmico estivesse diretamente associada à orientação do tablet. Você pode imaginar várias ações interessantes para executar com essas funcionalidades, inclusive jogos em primeira pessoa, experiências com mapas, navegação de pedestres e muito mais. Vamos ver como implementar esse tipo de funcionalidade no Windows 8.

Por que usar sensores?

Na conferência //Build de 2011, nossa equipe compartilhou detalhes sobre suporte do hardware para localização e sensores no Windows 8, além de informações sobre as APIs do Tempo de Execução do Windows para localização e sensores. Com o suporte a sensor do Windows 8, os usuários utilizarão recursos do sistema, como giro automático da tela e controle automático do brilho. Embora esses recursos sejam excelentes, são os aplicativos com reconhecimento de sensor e localização que realmente fascinam. Com o Windows 8, localização e sensores possibilitam uma variedade de experiências, que incluem cenários de navegação e compasso, jogos casuais, realidade ampliada, controle de movimentação da manipulação para jogos e muito mais.

Todos os tablets e conversíveis com Windows 8 incluirão estes sensores:

  • ALS (sensor de luz ambiente)
  • Sistema de fusão de sensores de 9 eixos que utiliza este hardware de sensor:
    • Acelerômetro 3D
    • Giro 3D
    • Magnetômetro 3D

Além disso, todos os PCs com Windows 8 incluem o Localizador do Windows (serviço de localização de software) e GPS (para PCs que têm hardware com banda larga móvel).

Isso significa que você pode ter acesso a uma impressionante variedade de funcionalidades de sensor e localização. Também significa que as funcionalidades podem variar de acordo com o fator forma do PC; portanto, é preciso considerar quais são os fatores forma de hardware de destino dos seus aplicativos.

Usando o recurso de localização em seu aplicativo

É fácil incluir suporte a localização em um aplicativo. Primeiramente, você precisa adicionar uma declaração da funcionalidade de localização no arquivo de manifesto do aplicativo. Essa declaração permite que o sistema saiba que o aplicativo pode tentar acessar a atual localização. Obviamente, o usuário controla a aprovação final sobre a possibilidade de acesso do aplicativo à atual localização. Você pode adicionar a declaração via Visual Studio (clique duas vezes em package.appxmanifest no Gerenciador de Soluções, clique na guia Funcionalidades e marque a caixa de seleção Location [Localização] na lista).

Esta é a aparência do editor de manifesto depois que você declara a funcionalidade de localização:

Interface de usuário para declaração da funcionalidade de localização

 

Esta é a aparência do trecho de código no arquivo package.appxmanifest.xml quando você declara a funcionalidade de localização: (isso é feito usando-se o editor de manifesto no Visual Studio)

<Capabilities>
<DeviceCapability Name="location" />
</Capabilities>

Depois de declarar a funcionalidade de localização no seu aplicativo, você poderá começar a desenvolver o código para acesso a dados de localização. A função de localização é incluída nas APIs do Tempo de Execução do Windows e pode ser acessada pelo namespace Windows.Devices.Geolocation. Ou você pode usar a API W3C para localização via JavaScript. Nesta publicação, mostraremos a variedade específica do Windows. Para obter mais detalhes sobre como usar a API W3C para localização, consulte o Guia de início rápido: como detectar a localização usando HTML5 (aplicativos estilo Metro com JavaScript e HTML).

Existem duas formas básicas de acesso a dados de localização: uma consulta única ou um fluxo de eventos que ocorrem quando o sistema detecta alguma alteração na localização. Vamos ver rapidamente cada um desses modelos de acesso para decidir qual é o melhor modelo para o seu aplicativo.

Acesso único a localização

Se você só precisa de acesso a localização sob demanda, por exemplo, para localizar pontos de interesse na área do usuário, anotando conteúdo com informações de localização, mostrando aos usuários a posição em um mapa, etc, pode fazer isso com várias linhas de código e também preservar o tempo de vida útil da bateria. Vamos verificar um trecho de código que demonstra a consulta única.

JavaScript:

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.positionAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.getGeopositionAsync().done(getPositionHandler, errorHandler);

function getPositionHandler(pos) {
var lat = pos.coordinate.latitude;
var long = pos.coordinate.longitude;
var acc = pos.coordinate.accuracy;
}

function errorHandler(err) {
// handle error
}

C#:

using Windows.Devices.Geolocation;

var loc = new Geolocator();

try
{
loc.DesiredAccuracy = PositionAccuracy.High;
Geoposition pos = await loc.GetGeopositionAsync();

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}
catch (System.UnauthorizedAccessException)
{
// handle error
}

Aqui vemos:

  • Criar um objeto Geolocator (objeto raiz para localização)
  • Invocar uma operação de forma assíncrona para saber a localização atual, com processamento de erros se o acesso à localização for negado.

Note que é possível cancelar uma chamada em andamento para GetGeopositionAsync se for preciso. Consulte a amostra do SDK de Localização Geográfica do Tempo de Execução do Windows para ver um código que demonstre isso. Para obter mais informações sobre o acesso único a localização, consulte o método Geolocator.GetGeopositionAsync() | getGeopositionAsync() e a amostra do SDK de Localização Geográfica.

Acesso contínuo à localização

Se o seu aplicativo precisar de acesso contínuo a dados de localização, por exemplo, navegação por mudança de direção, alertando o usuário da proximidade dos pontos de interesses, registro de rotas, entre outros, convém adicionar um ouvinte de eventos que o aplicativo chama quando um ou mais provedores de localização no sistema detecta uma alteração na localização. É assim que se ouvem as alterações na localização.

JavaScript:

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.desiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.addEventListener("positionchanged", onPositionChanged);

function onPositionChanged(e) {
var lat = e.position.coordinate.latitude;
var long = e.position.coordinate.longitude;
var acc = e.position.accuracy;
}

C#:

using Windows.Devices.Geolocation;

private Geolocator loc = new Geolocator();

private void StartTracking(object sender, RoutedEventArgs e)
{
loc.DesiredAccuracy = PositionAccuracy.High;
loc.PositionChanged += new TypedEventHandler<Geolocator, PositionChangedEventArgs>(OnPositionChanged);
}

private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
Geoposition pos = e.Position;

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}

Temos aqui praticamente o mesmo código que tínhamos com a pesquisa única; porém, em vez de executar uma operação assíncrona, adicionamos um ouvinte de eventos, delegando um representante para lidar com o evento. Agora, sempre que uma alteração de posição for detectada, o representante será chamado e poderemos usar dados de localização, quando nosso aplicativo precisar, com esse método. Se quiser influenciar a sensibilidade do evento ao movimento, você pode definir a propriedade MovementThreshold no objeto Geolocator.

Outro aspecto do ajuste do comportamento da API de localização é a capacidade de definir a propriedade DesiredAccuracy no objeto Geolocator. Se o seu aplicativo não necessita da precisão de um GPS (por exemplo, um aplicativo Clima), defina essa como a propriedade padrão a fim de economizar bateria, limitando o uso dos dispositivos GPS para determinar a posição.

Para obter mais informações sobre como adicionar reconhecimento de localização ao seu aplicativo, consulte a amostra de Localização Geográfica, as diretrizes para os aplicativos com reconhecimento de localização e os documentos de namespace de Windows.Devices.Geolocation no MSDN.

Sensores

O Windows 8 oferece um forma extensa e fácil de usar conjuntos de APIs para sensores. Essas classes encontram-se no namespace Windows.Devices.Sensors e representam o hardware de sensor subjacente correspondente:

  • LightSensor – sensor ALS
  • Acelerômetro – acelerômetro 3D (aceleração)
  • Girômetro – sensor de giro 3D (velocidade rotacional)
  • Compasso – direção compensada por inclinação (norte verdadeiro e norte magnético)
  • Inclinômetro – inclinação do dispositivo (rotação sobre o eixo y, rotação sobre o eixo x, rotação em rolo)
  • SimpleOrientationSensor – retrato/paisagem/face para cima/face para baixo
  • OrientationSensor – dados de orientação do dispositivo em 9 eixos (fusão de sensores) (quatérnion, matriz de rotação)

Você se lembra do modo panorâmico interativo do Photosynth de que falei no início? O que acontece é que podemos usar a fusão de sensores por meio das APIs do Tempo de Execução do Windows para implementar esses tipos de manipulações. Como queremos uma relação contínua e ágil entre a orientação do dispositivo e a câmera ou o mirador do modo panorâmico do Photosynth, precisamos usar a fusão de sensores por meio da classe Windows.Devices.Sensors.OrientationSensor. Para saber mais sobre a tecnologia subjacente usada para suporte à fusão de sensores, consulte a seção sobre o suporte aos sensores no Windows 8. A classe OrientationSensor expõe dois campos de dados que são uma forte representação da orientação do dispositivo: o vetor de quatro elementos chamado quatérnion e uma matriz de valores 3x3 chamada matriz de rotação. Esses campos de dados representam dados equivalentes, mas que são empacotados em formatos diferentes.

As especificações para a implementação do suporte para visões panorâmicas e inclinações via dados de quatérnion ou matriz de rotação (transformações, entre outros) estão fora do tema desta publicação, mas abordaremos a forma de acessar dados via API do Tempo de Execução do Windows.

Todos os objetos do sensor na API do Tempo de Execução do Windows para sensores seguem praticamente o mesmo padrão. Primeiramente, você cria o objeto de sensor. Em seguida, você inicializa e aplica as preferências (definindo o intervalo desejado para relato, por exemplo) e depois acessa os dados por meio de uma chamada síncrona ou pela inclusão de um ouvinte de eventos.

É assim que se acessam os dados de forma síncrona.

JavaScript:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

C#:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

Esse tipo de acesso pode ser recomendável se você somente precisar dos dados em certas circunstâncias (como marcar a orientação de um dispositivo em um objeto em resposta a uma ação do usuário) ou quando você precisar pesquisar dados em um timer (um loop de renderização em um jogo, por exemplo). Mesmo ao pesquisar dados, você deve definir o intervalo para relato, como indicado aqui, para que o hardware/drive dos sensores possa atualizar os dados à medida que o aplicativo precisar.

Em seguida, mostrarei como responder a eventos de alteração de leitura.

JavaScript:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;
sensor.reportInterval = reportInterval;

sensor.addEventListener("readingchanged", onDataChanged);
}

function onDataChanged(e) {
var quaternion = e.reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}

C#:

using Windows.Devices.Sensors;

private OrientationSensor sensor = OrientationSensor.GetDefault();

private void EnableReadings(object sender, RoutedEventArgs e)
{
if (sensor != null)
{
var minReportInterval = sensor.MinimumReportInterval;
var desiredReportInterval = minReportInterval > 20 ? minReportInterval : 20;

sensor.ReportInterval = desiredReportInterval;

sensor.ReadingChanged += new TypedEventHandler<OrientationSensor, OrientationSensorReadingChangedEventArgs>(ReadingChanged);
}
}

private void ReadingChanged(object sender, OrientationSensorReadingChangedEventArgs e)
{
SensorQuaternion quaternion = e.Reading.Quaternion;
var x = quaternion.X;
var y = quaternion.Y;
var z = quaternion.Z;
var w = quaternion.W;
}

Neste trecho de código, obtivemos um objeto OrientationSensor e depois definimos o intervalo para relato como 20 ou como o valor mínimo aceito (a taxa mais rápida para suprimento de dados pelo hardware do sensor), o valor que for maior. Dessa forma, conseguimos os dados nos intervalos mais próximos a cada 20 milissegundos, por exemplo, para o aplicativo em questão. Use um intervalo que seja apropriado ao seu aplicativo (tão rápido quanto você necessitar dos dados), para que a potência e o desempenho não sejam prejudicados.

No representante do ouvinte de eventos, aplicamos as transformações apropriadas usando os dados do quatérnion [x,y,z,w] para permitir manipulações entre movimentação/orientação em nosso aplicativo. Os dados equivalentes da matriz de rotação também estão disponíveis. Embora esse código de transformação esteja fora do assunto deste blog, existem várias fontes online de informações sobre como usar dados do quatérnion para cenários de jogos, robótica e muito mais. A vantagem de usar os dados do quatérnion (ou matriz de rotação) em relação aos dados do inclinômetro é a continuidade dos dados de rotação, o que evita o “bloqueio de eixos” inerente a cálculos de ângulo Euler.

Conclusão

Incluir a funcionalidade de sensor e localização em seu aplicativo pode suscitar experiências novas e interessantes para os usuários. Com o Windows 8, você tem acesso a um suporte abrangente para hardware e software, Visual Studio, APIs do Tempo de Execução do Windows fáceis de usar e uma variedade de linguagens de programação para aplicativos aprimorados com sensor e localização. Com isso, a implementação desses recursos em seu aplicativo torna-se uma tarefa vantajosa e simples. O que você vai criar então?

-- Gavin Gear, Gerente de programas

--Dino Natucci, Gerente de programas

  • Loading...
Leave a Comment
  • Please add 4 and 4 and type the answer here:
  • Post