Utilizando
Intenções Para
Mapas de Alta
Qualidade no
Android
thiengo.com.br
Maps Intents vs Maps API
Qual a real vantagem em trabalharmos com
intenções ao invés de trabalharmos diretamente
com alguma API de mapas no Android?
Provavelmente a pergunta anterior é a primeira que vem a sua cabeça, tendo em
mente que o trabalho com intenções de mapas invoca o aplicativo do Google Maps
ao invés de apresentar toda a configuração de rota, localidade, ... dentro do próprio
aplicativo que está sendo desenvolvido.
Até parece que estamos perdendo em qualidade e em glamour. Mas na verdade o
uso da API do Google Maps é muito mais estrito do que se parece, digo, estrito em
termos de domínios de problema que necessitam desta API.
A recomendação do Google é que: a API do Google Maps somente seja utilizada
se parte da ideia central do aplicativo for a apresentação de mapas.
A seguir temos alguns contextos, de exemplo,
que certamente se saem melhor com os mapas
sendo utilizados dentro deles:
• Aplicativo de passeadores de cachorros,
onde o dono do pet poderá acompanhar a
rota de passeio, em tempo real, pelo mapa
apresentado no app;
• Aplicativo de tracking de filho, onde os pais
poderão acompanhar toda a
movimentação do filho quando ele não
estiver próximo a eles.
Para os tipos de aplicativos comentados
anteriormente o trabalho com a API de mapas
(junto a API de localização) se faz necessário.
Isso também, pois o Google Maps App não
permiti que aplicativos externos enviem a ele
coordenadas para atualização de mapa em
real-time.
A seguir temos a listagem de alguns contextos
que não exigem o trabalho com a API de mapas,
onde as Intents do Google Maps se saem
melhores:
• Aplicativo de classificados, em geral;
• Aplicativo de portfólio, muito comum em
domínios como:
• Salão de beleza;
• e Advogados.
As opções acima não exigem que a API do
Google Maps seja utilizada, mesmo que a
apresentação de rotas seja necessária.
O Google Maps Android fornece intenções que
permitem a apresentação adequada de mapas
pelo Google Maps App, isso com um simples
acionamento de botão, por exemplo.
As principais vantagens quando trabalhando com intenções de mapas, são:
• Facilidade de implementação, exigindo poucas linhas de código. Permitindo
assim mais tempo de desenvolvimento focado no domínio do problema do
aplicativo;
• Alta qualidade na apresentação do mapa, pois o aplicativo utilizado será o do
Google Maps, app específico para trabalho com mapas e localização.
Até este ponto, como resumo, temos que:
Se seu aplicativo atual não tem como uma das principais propostas dele o
trabalho com mapas sendo atualizados em real-time, estude a possibilidade
de utilizar intenções do Google Maps, pois é provável que até mesmo em
termos de UX (experiência do usuário) seja uma melhor escolha.
Intenções do Google Maps Android
O Google Maps tem mais de uma categoria de
intenções. Há intenções para aplicativos
Android, para aplicativos iOS e intenções
genéricas que atendem a todas as plataformas,
são as intenções com domínios Web, que na
verdade são denominadas: Maps URLs.
A recomendação do Google é que as Maps
URLs sejam utilizadas caso o aplicativo em
desenvolvimento atenda a mais de uma
plataforma (Android, iOS, Web).
Como aqui nosso foco é no desenvolvimento
Android, vamos prosseguir com as intenções
para este sistema operacional mobile, porém,
quando necessário, utilizaremos as Maps URLs
para nos ajudar em limitações ainda presentes
nas intenções específicas para o Android.
A seguir as possibilidades de mapas
que temos quando utilizando Google
Maps Intents:
• Exibir um mapa com um local e
zoom especificados;
• Pesquisar e exibir em mapa locais
próximos, incluindo pontos
privados e públicos;
• Solicitar e exibir rotas de um local
para outro, incluindo rotas para os
modos: dirigir (drive), caminhar
(walk) e andar de bicicleta
(bicycle);
• Exibir imagens de panorama no
Google Street View.
Codificando com intenções do
Google Maps Android
Apresentação simples de um local específico
A sintaxe de URI de intenção para a maneira mais simples de uso de intenções de
Google Maps é a seguinte:
O zoom pode variar de 0, todo o planeta, a 21, locais individuais.
A seguir um código de exemplo que quando acionado apresenta no mapa o local
definido em latitudeLongitude:
Note a sintaxe para a construção da intenção de mapa:
Destrinchando ela, temos:
• Intent( Intent.ACTION_VIEW, geoUri ):
• A ação é sempre Intent.ACTION_VIEW;
• O segundo argumento é uma URI específica do Google Maps, pode ser
uma URI de domínio Android ou uma URI de domínio Web, pois mesmo
assim o Google Maps App responderá.
• setPackage( "com.google.android.apps.maps" ):
• O único argumento possível indica qual o aplicativo preferencial para
responder a Intent criada. Aqui sempre colocamos
"com.google.android.apps.maps" que é o nome único de pacote do
Google Maps Android App.
Executando o código simples de intenção
de Google Maps Android, apresentado
anteriormente, temos:
Evitando exceções quando a intenção não
puder ser respondida
Mesmo que pouco provável, pode acontecer de
um usuário ou outro não ter nem o Google Maps e
nem algum outro aplicativo que possa responder
a intenção de mapa criada.
Para esse caso, se não houver um código de
segurança, uma exceção será gerada, mais
precisamente a exceção
ActivityNotFoundException, e o aplicativo vai
ser fechado, nada agradável para a experiência
do usuário.
O código de segurança é simples, basta utilizar resolveActivity() como a seguir:
O que intent.resolveActivity( packageManager ) está fazendo é verificar se há
algum aplicativo no aparelho do usuário que responda a intent, não precisa ser o
Google Maps App, mesmo que o package dele tenha sido definido. Qualquer
aplicativo que responda a intent é válido. Note que packageManager representa o
conhecido método getPackageManager(), sintaxe comum no Java.
Com uma melhoria no código anterior também podemos ter a opção de abrir o
mapa via Google Maps Web, pelo navegador do aparelho. Veja o algoritmo a seguir:
No código anterior, mesmo utilizando a
sintaxe Web de apresentação de mapa,
ainda é seguro verificar se há aplicativo que
responde à nova Intent construída.
Neste conjunto de slides não entraremos no
estudo aprofundado das Maps URLs, logo,
caso seja de seu interesse, ao final do
conteúdo acesse a documentação oficial em:
Maps URLs - Developer Guide (em inglês).
Executando o último código mostrado,
quando não há aplicativos específicos para
trabalho com mapas, a apresentação é
carregada no navegador padrão do
emulador.
Busca por localizações: sintaxe e pontos mais
próximos do usuário
As sintaxes de URIs que podemos trabalhar em intenções de buscas para o
Google Maps são as seguintes:
A seguir um código de exemplo que tem a responsabilidade de apresentar os
restaurantes mais próximos ao usuário do aplicativo:
Executando o código anterior, temos:
Trabalhando o raio da busca por localização e
pontos mais próximos
O raio de busca é baseado no valor do zoom. O código a seguir é o mesmo da
seção (slides) anterior, porém com o zoom definido:
Executando o código anterior, temos:
Pontos mais próximos de uma latitude e
longitude definidos
Até este ponto do conteúdo já ficou evidente que as configurações de 0,0 para
latitude e longitude informam ao Google Maps que é para utilizar a localização
atual do aparelho como ponto de referência.
Caso fosse necessária a apresentação de estabelecimentos próximos a algum
outro ponto, que não seja a posição atual do usuário, bastaria trabalhar a
definição de latitude e longitude como no exemplo a seguir:
Executando o código anterior, temos:
Busca por um local específico
Quando o endereço completo de um local é utilizado como item de busca, o pin
do Google Maps é colocado nesse local. Veja o exemplo a seguir:
Note a importância de Uri.encode(). Com ele nem mesmo precisamos saber
quais são os caracteres permitidos em uma URI, pois encode() nos garante que
os caracteres de escape, se necessários, serão utilizados.
Executando o código anterior, temos:
Buscando endereço de acordo com a posição
atual do usuário
Para buscar por determinado endereço mais próximo ao usuário, utilize uma
definição de intenção de mapa como a seguir:
Note que não há muita precisão no algoritmo anterior, sendo assim o mapa
poderá mostrar mais de uma opção de acordo com o posicionamento atual do
usuário.
De qualquer forma, caso o endereço de seu domínio de problema seja realmente
único, então utilize com segurança o modelo de código acima, somente não
esqueça de realizar testes para garantir que não haverá ambiguidade em mapa.
Executando o código anterior, temos:
Buscando endereço de acordo com a latitude
e longitude fornecidos
Para ter maior precisão em uma apresentação de local por meio de endereço,
utilize os dados de latitude e longitude de maneira explicita. Veja o exemplo a
seguir:
O local utilizado como referência, Hospital Estadual Dr. Jayme Santos Neves, é o
que comumente fornecemos como "ponto de referência" em formulários de
cadastro.
Executando o código anterior, temos:
Segundo meus testes, se
os locais encontrados
forem próximos a posição
atual do usuário, mesmo
com a latitude e longitude
definidos, a prioridade
passa a ser: apresentar
todos os locais, de mesmo
nome, próximos ao
usuário e não os locais
próximos ao ponto
definido em latitude e
longitude.
Definindo rótulo para o endereço buscado
Para uma apresentação de local específico, com a latitude e a longitude definidos
em q, é possível colocar um rótulo customizado, respeitando a regra: geo:0,0?
q=latitude,longitude(rotulo).
Veja o código a seguir:
Executando o código anterior, temos:
Apresentando rota e guia turn-by-turn (GPS)
Para a apresentação de rota temos de seguir alguma das sintaxes de URI a
seguir:
A rota será definida de acordo com a posição atual do usuário.
Abaixo um código de exemplo, onde o usuário está no Shopping Montserrat, em
Serra - ES, e precisa de uma rota para o Shopping Vitória, em Vitória - ES:
Executando o código anterior, temos:
Se o usuário quiser ver a rota completa, pois ele inicia já com a tecnologia turn-
by-turn em uso, ele precisa acessar a tela de rota ampla, acessar esta tela
acionando o back button do Android, por exemplo. Assim ele terá:
Apresentando rota com definição de meio de
transporte
A apresentação de rota com definição de meio de transporte tem as mesmas regras de sintaxe
apresentadas na seção anterior, porém aqui ainda temos o parâmetro mode, parâmetro que aceita
os seguintes valores:
• d para indicar que o trajeto será seguido em um automóvel (drive). d é o valor padrão;
• w para indicar que o trajeto será seguido a pé (walk);
• b para indicar que o trajeto será seguido de bicicleta (bicycle).
Veja o código a seguir:
Executando o código anterior, temos:
Apresentando rota com definição de itens a
evitar
É possível solicitar a apresentação de rota com itens a evitar. Para isso utilizamos o parâmetro
avoid. A seguir os valores possíveis em avoid:
• t para evitar pedágios (tolls);
• h para evitar rodovias (highways);
• f para evitar balsas (ferries).
Em itens a evitar o valor padrão é o "não uso" de avoid. Veja o código a seguir:
Executando o código anterior, temos:
Em avoid é possível
definir mais de um
valor, diferente de
mode. Também é
possível utilizar
mode e avoid na
mesma intenção de
Google Maps.
Apresentando rotas com o uso de WayPoints
(pontos obrigatórios em trajeto)
Mesmo não tendo uma intenção Google Maps Android específica para a
apresentação de rota com pontos obrigatórios de passagem, utilizando a versão
genérica, com Maps URLs, é possível ainda acionar o Google Maps App com
essa característica.
Veja o código do slide a seguir:
Executando o código anterior, temos:
Visualizando o mapa completo da rota com WayPoints, temos:
Note que a definição
anterior utilizando sintaxe
Maps URLs também
permite o uso do
parâmetro origin, mas
como o objetivo era
apresentar a rota de
acordo com o
posicionamento atual do
usuário, origin foi omitido,
algo que para o Google
Maps App indica: utilize
como ponto de origem de
rota o posicionamento
atual do aparelho.
Trabalhando com o Street View
Caso seu domínio do problema exija, é possível invocar o Google Maps com o
Street View acionado. Para isso primeiro vamos a sintaxe de URI para uso da
tecnologia Street View via intenções de Google Maps:
A sintaxe aqui é um pouco mais complicada do que as apresentadas em seções
(slides) anteriores. Logo, vamos, no slide a seguir, a discussão sobre as opções.
• cbll aceita uma latitude e longitude como valores separados por vírgula. O aplicativo exibirá o
panorama fotografado mais próximo ao local definido;
• panoid é um ID de panorama. O Google Maps usará o panoid se caso um cbll também for
informado. Os panoids estão disponíveis para aplicativos Android por meio da classe
StreetViewPanoramaLocation;
• cbp é um parâmetro opcional que ajusta a orientação inicial da câmera. O cbp recebe 5 valores
separados por vírgulas, todos eles são opcionais, mas precisam estar presentes se ao menos um
tiver de ser definido. Os valores mais significativos são o segundo, o quarto e o quinto, que
definem o rumo (bearing), o zoom e a inclinação (tilt), respectivamente. O primeiro e terceiro
valores não são suportados e devem ser definidos como 0. Agora um pouco mais sobre os três
valores que importam:
• bearing indica o rumo da bússola da câmera, em graus, no sentido horário a partir do norte.
O norte é 0º, o leste é 90º, o sul é 180º e o oeste é 270º. Os valores passados para bearing
são encerráveis, ou seja: 0°, 360° e 720° apontam para a mesma direção. bearing é o
segundo de cinco valores separados por vírgulas;
• zoom define o nível de zoom da câmera. O nível de zoom padrão é definido em 0. Um zoom
em 1 duplica a ampliação. O zoom é fixado entre 0 e o nível máximo de zoom do panorama
atual. Isso significa que qualquer valor que esteja fora desse intervalo será definido como o
extremo mais próximo dentro desse intervalo. Por exemplo, um valor de -1 será definido
como 0. zoom é o quarto de cinco valores separados por vírgulas;
• tilt especifica o ângulo, para cima ou para baixo, da câmera. O alcance é de -90 a 0 a 90,
com 90 apontando para baixo, 0 centrado no horizonte e -90 apontando para cima.
A seguir um código de intenção Street View com coordenadas definidas,
buscando o panorama mais próximo do Shopping Vitória, no Espírito Santo:
Executando o código anterior, temos:
A seguir um código de intenção Street View com um identificador único de
panorama, panoid, definido. Segue código:
Executando o código anterior, temos:
A seguir um código de intenção Street View entre as pirâmides de Giza, dessa
vez fazendo uso de parâmetros cbp:
Executando o código anterior, temos:
Utilizando Plus Code em intenções de mapa
Como uma alternativa a fornecer endereço ou latitude e longitude nas intenções
do Google Maps, temos o plus code. A seguir a definição de plus code, direto do
site oficial.
Um plus code é como um endereço de rua para pessoas ou lugares que
não têm um.
Os plus codes fornecem endereços para todos, em qualquer lugar,
permitindo que eles recebam entregas, acessem serviços de emergência,
registrem-se para votar e muito mais.
Um endereço de plus code mais parece um endereço regular, mas com um
código curto, onde o nome da rua e o número estariam presentes caso
existissem. Esses endereços existem para qualquer local, mesmo aqueles
onde não há estradas.
Mais sobre o plus code você encontra em: https://plus.codes/.
A seguir um código de exemplo que faz uso de um plus code, mais precisamente
o plus code que aponta para Rincon Hill, São Francisco, Califórnia:
Executando o código anterior, temos:
Ponto negativo
• Não há intenções Google Maps para definições de formas geométricas em
mapa.
Pontos positivos
• Com poucas linhas de código e com o auxílio do Google Maps App é possível
ter a maior qualidade em apresentação de mapas;
• A resposta do Google Maps App mesmo quando é uma Maps URL em uso é
algo que aumenta ainda mais a abrangência das intenções de mapa no
Android.
Conclusão
Mesmo que o acordo em projeto tenha exigido a apresentação de mapas dentro
do aplicativo solicitado, estude bem o domínio do problema do app e então
verifique se uma intenção de Google Maps se sairia melhor.
Confirmando que sim: intenção de mapa é a melhor opção. Não hesite em
mostrar aos stakeholders as vantagens das Intents Google Maps, onde a principal
delas acaba sendo a qualidade do Google Maps App para o trabalho com mapas,
dos mais simples aos mais complexos.
Lembrando que algumas limitações nas intenções exclusivas do Google Maps
Android podem ser resolvidas utilizando as Maps URLs, como fizemos na seção
(slides) que aborda WayPoints.
Fontes
Conteúdo completo, em texto e em vídeo, no link a seguir:
• https://www.thiengo.com.br/utilizando-intencoes-para-mapas-de-alta-
qualidade-no-android
Fontes:
• https://developers.google.com/maps/documentation/urls/android-intents
• https://developers.google.com/maps/documentation/urls/guide
• https://developers.google.com/maps/documentation/urls/url-encoding
Para estudo
• Treinamento oficial:
• Prototipagem Profissional de Aplicativos Android.
• Meus livros:
• Receitas Para Desenvolvedores Android;
• Refatorando Para Programas Limpos.
• Redes:
• Udemy;
• YouTube;
• Facebook;
• LinkedIn;
• GitHub;
• Twitter;
• Google Plus.
• Blog App.
Utilizando Intenções Para Mapas de
Alta Qualidade no Android
thiengo.com.br
Vinícius Thiengo
thiengocalopsita@gmail.com

Utilizando Intenções Para Mapas de Alta Qualidade no Android

  • 1.
    Utilizando Intenções Para Mapas deAlta Qualidade no Android thiengo.com.br
  • 2.
    Maps Intents vsMaps API Qual a real vantagem em trabalharmos com intenções ao invés de trabalharmos diretamente com alguma API de mapas no Android? Provavelmente a pergunta anterior é a primeira que vem a sua cabeça, tendo em mente que o trabalho com intenções de mapas invoca o aplicativo do Google Maps ao invés de apresentar toda a configuração de rota, localidade, ... dentro do próprio aplicativo que está sendo desenvolvido. Até parece que estamos perdendo em qualidade e em glamour. Mas na verdade o uso da API do Google Maps é muito mais estrito do que se parece, digo, estrito em termos de domínios de problema que necessitam desta API. A recomendação do Google é que: a API do Google Maps somente seja utilizada se parte da ideia central do aplicativo for a apresentação de mapas.
  • 3.
    A seguir temosalguns contextos, de exemplo, que certamente se saem melhor com os mapas sendo utilizados dentro deles: • Aplicativo de passeadores de cachorros, onde o dono do pet poderá acompanhar a rota de passeio, em tempo real, pelo mapa apresentado no app; • Aplicativo de tracking de filho, onde os pais poderão acompanhar toda a movimentação do filho quando ele não estiver próximo a eles. Para os tipos de aplicativos comentados anteriormente o trabalho com a API de mapas (junto a API de localização) se faz necessário. Isso também, pois o Google Maps App não permiti que aplicativos externos enviem a ele coordenadas para atualização de mapa em real-time.
  • 4.
    A seguir temosa listagem de alguns contextos que não exigem o trabalho com a API de mapas, onde as Intents do Google Maps se saem melhores: • Aplicativo de classificados, em geral; • Aplicativo de portfólio, muito comum em domínios como: • Salão de beleza; • e Advogados. As opções acima não exigem que a API do Google Maps seja utilizada, mesmo que a apresentação de rotas seja necessária. O Google Maps Android fornece intenções que permitem a apresentação adequada de mapas pelo Google Maps App, isso com um simples acionamento de botão, por exemplo.
  • 5.
    As principais vantagensquando trabalhando com intenções de mapas, são: • Facilidade de implementação, exigindo poucas linhas de código. Permitindo assim mais tempo de desenvolvimento focado no domínio do problema do aplicativo; • Alta qualidade na apresentação do mapa, pois o aplicativo utilizado será o do Google Maps, app específico para trabalho com mapas e localização. Até este ponto, como resumo, temos que: Se seu aplicativo atual não tem como uma das principais propostas dele o trabalho com mapas sendo atualizados em real-time, estude a possibilidade de utilizar intenções do Google Maps, pois é provável que até mesmo em termos de UX (experiência do usuário) seja uma melhor escolha.
  • 6.
    Intenções do GoogleMaps Android O Google Maps tem mais de uma categoria de intenções. Há intenções para aplicativos Android, para aplicativos iOS e intenções genéricas que atendem a todas as plataformas, são as intenções com domínios Web, que na verdade são denominadas: Maps URLs. A recomendação do Google é que as Maps URLs sejam utilizadas caso o aplicativo em desenvolvimento atenda a mais de uma plataforma (Android, iOS, Web). Como aqui nosso foco é no desenvolvimento Android, vamos prosseguir com as intenções para este sistema operacional mobile, porém, quando necessário, utilizaremos as Maps URLs para nos ajudar em limitações ainda presentes nas intenções específicas para o Android.
  • 7.
    A seguir aspossibilidades de mapas que temos quando utilizando Google Maps Intents: • Exibir um mapa com um local e zoom especificados; • Pesquisar e exibir em mapa locais próximos, incluindo pontos privados e públicos; • Solicitar e exibir rotas de um local para outro, incluindo rotas para os modos: dirigir (drive), caminhar (walk) e andar de bicicleta (bicycle); • Exibir imagens de panorama no Google Street View.
  • 8.
    Codificando com intençõesdo Google Maps Android
  • 9.
    Apresentação simples deum local específico A sintaxe de URI de intenção para a maneira mais simples de uso de intenções de Google Maps é a seguinte: O zoom pode variar de 0, todo o planeta, a 21, locais individuais.
  • 10.
    A seguir umcódigo de exemplo que quando acionado apresenta no mapa o local definido em latitudeLongitude:
  • 11.
    Note a sintaxepara a construção da intenção de mapa: Destrinchando ela, temos: • Intent( Intent.ACTION_VIEW, geoUri ): • A ação é sempre Intent.ACTION_VIEW; • O segundo argumento é uma URI específica do Google Maps, pode ser uma URI de domínio Android ou uma URI de domínio Web, pois mesmo assim o Google Maps App responderá. • setPackage( "com.google.android.apps.maps" ): • O único argumento possível indica qual o aplicativo preferencial para responder a Intent criada. Aqui sempre colocamos "com.google.android.apps.maps" que é o nome único de pacote do Google Maps Android App.
  • 12.
    Executando o códigosimples de intenção de Google Maps Android, apresentado anteriormente, temos:
  • 13.
    Evitando exceções quandoa intenção não puder ser respondida Mesmo que pouco provável, pode acontecer de um usuário ou outro não ter nem o Google Maps e nem algum outro aplicativo que possa responder a intenção de mapa criada. Para esse caso, se não houver um código de segurança, uma exceção será gerada, mais precisamente a exceção ActivityNotFoundException, e o aplicativo vai ser fechado, nada agradável para a experiência do usuário.
  • 14.
    O código desegurança é simples, basta utilizar resolveActivity() como a seguir: O que intent.resolveActivity( packageManager ) está fazendo é verificar se há algum aplicativo no aparelho do usuário que responda a intent, não precisa ser o Google Maps App, mesmo que o package dele tenha sido definido. Qualquer aplicativo que responda a intent é válido. Note que packageManager representa o conhecido método getPackageManager(), sintaxe comum no Java.
  • 15.
    Com uma melhoriano código anterior também podemos ter a opção de abrir o mapa via Google Maps Web, pelo navegador do aparelho. Veja o algoritmo a seguir:
  • 16.
    No código anterior,mesmo utilizando a sintaxe Web de apresentação de mapa, ainda é seguro verificar se há aplicativo que responde à nova Intent construída. Neste conjunto de slides não entraremos no estudo aprofundado das Maps URLs, logo, caso seja de seu interesse, ao final do conteúdo acesse a documentação oficial em: Maps URLs - Developer Guide (em inglês). Executando o último código mostrado, quando não há aplicativos específicos para trabalho com mapas, a apresentação é carregada no navegador padrão do emulador.
  • 17.
    Busca por localizações:sintaxe e pontos mais próximos do usuário As sintaxes de URIs que podemos trabalhar em intenções de buscas para o Google Maps são as seguintes:
  • 18.
    A seguir umcódigo de exemplo que tem a responsabilidade de apresentar os restaurantes mais próximos ao usuário do aplicativo:
  • 19.
    Executando o códigoanterior, temos:
  • 20.
    Trabalhando o raioda busca por localização e pontos mais próximos O raio de busca é baseado no valor do zoom. O código a seguir é o mesmo da seção (slides) anterior, porém com o zoom definido:
  • 21.
    Executando o códigoanterior, temos:
  • 22.
    Pontos mais próximosde uma latitude e longitude definidos Até este ponto do conteúdo já ficou evidente que as configurações de 0,0 para latitude e longitude informam ao Google Maps que é para utilizar a localização atual do aparelho como ponto de referência. Caso fosse necessária a apresentação de estabelecimentos próximos a algum outro ponto, que não seja a posição atual do usuário, bastaria trabalhar a definição de latitude e longitude como no exemplo a seguir:
  • 23.
    Executando o códigoanterior, temos:
  • 24.
    Busca por umlocal específico Quando o endereço completo de um local é utilizado como item de busca, o pin do Google Maps é colocado nesse local. Veja o exemplo a seguir: Note a importância de Uri.encode(). Com ele nem mesmo precisamos saber quais são os caracteres permitidos em uma URI, pois encode() nos garante que os caracteres de escape, se necessários, serão utilizados.
  • 25.
    Executando o códigoanterior, temos:
  • 26.
    Buscando endereço deacordo com a posição atual do usuário Para buscar por determinado endereço mais próximo ao usuário, utilize uma definição de intenção de mapa como a seguir: Note que não há muita precisão no algoritmo anterior, sendo assim o mapa poderá mostrar mais de uma opção de acordo com o posicionamento atual do usuário. De qualquer forma, caso o endereço de seu domínio de problema seja realmente único, então utilize com segurança o modelo de código acima, somente não esqueça de realizar testes para garantir que não haverá ambiguidade em mapa.
  • 27.
    Executando o códigoanterior, temos:
  • 28.
    Buscando endereço deacordo com a latitude e longitude fornecidos Para ter maior precisão em uma apresentação de local por meio de endereço, utilize os dados de latitude e longitude de maneira explicita. Veja o exemplo a seguir: O local utilizado como referência, Hospital Estadual Dr. Jayme Santos Neves, é o que comumente fornecemos como "ponto de referência" em formulários de cadastro.
  • 29.
    Executando o códigoanterior, temos: Segundo meus testes, se os locais encontrados forem próximos a posição atual do usuário, mesmo com a latitude e longitude definidos, a prioridade passa a ser: apresentar todos os locais, de mesmo nome, próximos ao usuário e não os locais próximos ao ponto definido em latitude e longitude.
  • 30.
    Definindo rótulo parao endereço buscado Para uma apresentação de local específico, com a latitude e a longitude definidos em q, é possível colocar um rótulo customizado, respeitando a regra: geo:0,0? q=latitude,longitude(rotulo). Veja o código a seguir:
  • 31.
    Executando o códigoanterior, temos:
  • 32.
    Apresentando rota eguia turn-by-turn (GPS) Para a apresentação de rota temos de seguir alguma das sintaxes de URI a seguir: A rota será definida de acordo com a posição atual do usuário. Abaixo um código de exemplo, onde o usuário está no Shopping Montserrat, em Serra - ES, e precisa de uma rota para o Shopping Vitória, em Vitória - ES:
  • 33.
    Executando o códigoanterior, temos:
  • 34.
    Se o usuárioquiser ver a rota completa, pois ele inicia já com a tecnologia turn- by-turn em uso, ele precisa acessar a tela de rota ampla, acessar esta tela acionando o back button do Android, por exemplo. Assim ele terá:
  • 35.
    Apresentando rota comdefinição de meio de transporte A apresentação de rota com definição de meio de transporte tem as mesmas regras de sintaxe apresentadas na seção anterior, porém aqui ainda temos o parâmetro mode, parâmetro que aceita os seguintes valores: • d para indicar que o trajeto será seguido em um automóvel (drive). d é o valor padrão; • w para indicar que o trajeto será seguido a pé (walk); • b para indicar que o trajeto será seguido de bicicleta (bicycle). Veja o código a seguir:
  • 36.
    Executando o códigoanterior, temos:
  • 37.
    Apresentando rota comdefinição de itens a evitar É possível solicitar a apresentação de rota com itens a evitar. Para isso utilizamos o parâmetro avoid. A seguir os valores possíveis em avoid: • t para evitar pedágios (tolls); • h para evitar rodovias (highways); • f para evitar balsas (ferries). Em itens a evitar o valor padrão é o "não uso" de avoid. Veja o código a seguir:
  • 38.
    Executando o códigoanterior, temos: Em avoid é possível definir mais de um valor, diferente de mode. Também é possível utilizar mode e avoid na mesma intenção de Google Maps.
  • 39.
    Apresentando rotas como uso de WayPoints (pontos obrigatórios em trajeto) Mesmo não tendo uma intenção Google Maps Android específica para a apresentação de rota com pontos obrigatórios de passagem, utilizando a versão genérica, com Maps URLs, é possível ainda acionar o Google Maps App com essa característica. Veja o código do slide a seguir:
  • 41.
    Executando o códigoanterior, temos:
  • 42.
    Visualizando o mapacompleto da rota com WayPoints, temos: Note que a definição anterior utilizando sintaxe Maps URLs também permite o uso do parâmetro origin, mas como o objetivo era apresentar a rota de acordo com o posicionamento atual do usuário, origin foi omitido, algo que para o Google Maps App indica: utilize como ponto de origem de rota o posicionamento atual do aparelho.
  • 43.
    Trabalhando com oStreet View Caso seu domínio do problema exija, é possível invocar o Google Maps com o Street View acionado. Para isso primeiro vamos a sintaxe de URI para uso da tecnologia Street View via intenções de Google Maps: A sintaxe aqui é um pouco mais complicada do que as apresentadas em seções (slides) anteriores. Logo, vamos, no slide a seguir, a discussão sobre as opções.
  • 44.
    • cbll aceitauma latitude e longitude como valores separados por vírgula. O aplicativo exibirá o panorama fotografado mais próximo ao local definido; • panoid é um ID de panorama. O Google Maps usará o panoid se caso um cbll também for informado. Os panoids estão disponíveis para aplicativos Android por meio da classe StreetViewPanoramaLocation; • cbp é um parâmetro opcional que ajusta a orientação inicial da câmera. O cbp recebe 5 valores separados por vírgulas, todos eles são opcionais, mas precisam estar presentes se ao menos um tiver de ser definido. Os valores mais significativos são o segundo, o quarto e o quinto, que definem o rumo (bearing), o zoom e a inclinação (tilt), respectivamente. O primeiro e terceiro valores não são suportados e devem ser definidos como 0. Agora um pouco mais sobre os três valores que importam: • bearing indica o rumo da bússola da câmera, em graus, no sentido horário a partir do norte. O norte é 0º, o leste é 90º, o sul é 180º e o oeste é 270º. Os valores passados para bearing são encerráveis, ou seja: 0°, 360° e 720° apontam para a mesma direção. bearing é o segundo de cinco valores separados por vírgulas; • zoom define o nível de zoom da câmera. O nível de zoom padrão é definido em 0. Um zoom em 1 duplica a ampliação. O zoom é fixado entre 0 e o nível máximo de zoom do panorama atual. Isso significa que qualquer valor que esteja fora desse intervalo será definido como o extremo mais próximo dentro desse intervalo. Por exemplo, um valor de -1 será definido como 0. zoom é o quarto de cinco valores separados por vírgulas; • tilt especifica o ângulo, para cima ou para baixo, da câmera. O alcance é de -90 a 0 a 90, com 90 apontando para baixo, 0 centrado no horizonte e -90 apontando para cima.
  • 45.
    A seguir umcódigo de intenção Street View com coordenadas definidas, buscando o panorama mais próximo do Shopping Vitória, no Espírito Santo:
  • 46.
    Executando o códigoanterior, temos:
  • 47.
    A seguir umcódigo de intenção Street View com um identificador único de panorama, panoid, definido. Segue código:
  • 48.
    Executando o códigoanterior, temos:
  • 49.
    A seguir umcódigo de intenção Street View entre as pirâmides de Giza, dessa vez fazendo uso de parâmetros cbp:
  • 50.
    Executando o códigoanterior, temos:
  • 51.
    Utilizando Plus Codeem intenções de mapa Como uma alternativa a fornecer endereço ou latitude e longitude nas intenções do Google Maps, temos o plus code. A seguir a definição de plus code, direto do site oficial. Um plus code é como um endereço de rua para pessoas ou lugares que não têm um. Os plus codes fornecem endereços para todos, em qualquer lugar, permitindo que eles recebam entregas, acessem serviços de emergência, registrem-se para votar e muito mais. Um endereço de plus code mais parece um endereço regular, mas com um código curto, onde o nome da rua e o número estariam presentes caso existissem. Esses endereços existem para qualquer local, mesmo aqueles onde não há estradas. Mais sobre o plus code você encontra em: https://plus.codes/.
  • 52.
    A seguir umcódigo de exemplo que faz uso de um plus code, mais precisamente o plus code que aponta para Rincon Hill, São Francisco, Califórnia:
  • 53.
    Executando o códigoanterior, temos:
  • 54.
    Ponto negativo • Nãohá intenções Google Maps para definições de formas geométricas em mapa.
  • 55.
    Pontos positivos • Compoucas linhas de código e com o auxílio do Google Maps App é possível ter a maior qualidade em apresentação de mapas; • A resposta do Google Maps App mesmo quando é uma Maps URL em uso é algo que aumenta ainda mais a abrangência das intenções de mapa no Android.
  • 56.
    Conclusão Mesmo que oacordo em projeto tenha exigido a apresentação de mapas dentro do aplicativo solicitado, estude bem o domínio do problema do app e então verifique se uma intenção de Google Maps se sairia melhor. Confirmando que sim: intenção de mapa é a melhor opção. Não hesite em mostrar aos stakeholders as vantagens das Intents Google Maps, onde a principal delas acaba sendo a qualidade do Google Maps App para o trabalho com mapas, dos mais simples aos mais complexos. Lembrando que algumas limitações nas intenções exclusivas do Google Maps Android podem ser resolvidas utilizando as Maps URLs, como fizemos na seção (slides) que aborda WayPoints.
  • 57.
    Fontes Conteúdo completo, emtexto e em vídeo, no link a seguir: • https://www.thiengo.com.br/utilizando-intencoes-para-mapas-de-alta- qualidade-no-android Fontes: • https://developers.google.com/maps/documentation/urls/android-intents • https://developers.google.com/maps/documentation/urls/guide • https://developers.google.com/maps/documentation/urls/url-encoding
  • 58.
    Para estudo • Treinamentooficial: • Prototipagem Profissional de Aplicativos Android. • Meus livros: • Receitas Para Desenvolvedores Android; • Refatorando Para Programas Limpos. • Redes: • Udemy; • YouTube; • Facebook; • LinkedIn; • GitHub; • Twitter; • Google Plus. • Blog App.
  • 59.
    Utilizando Intenções ParaMapas de Alta Qualidade no Android thiengo.com.br Vinícius Thiengo thiengocalopsita@gmail.com