Como criar um app Android com mapa

Depois que escrevi o post sobre como criar um app Android com GPS muitos leitores me pediram para fazer uma parte 2, contendo um tutorial de como pinnar um local no mapa do Google dentro de um app. Isso é algo extremamente fácil de fazer em plataformas híbridas como Phonegap, mas gera um tanto de dúvidas em apps nativos, motivo do post de hoje.

Veremos neste post:

Criando e configurando o projeto

Primeiro, crie um novo projeto no Android Studio chamado MapApp com qualquer versão de Android acima da 4 e escolha como activity inicial uma do tipo Map Activity, como na imagem abaixo.

Isso irá criar alguns arquivos diferentes no seu projeto. O primeiro deles, google_maps_api.xml, estará na pasta values e será aberto automaticamente quando seu projeto for criado, indicando que você deve, antes de mais nada, obter uma API Key do Google Maps para poder fazer essa integração.

Para obter tal API, acesse esse link e preencha todos os dados que eles pedirem para obter uma chave. Se o link não funcionar é porque está configurado para minha aplicação, mas não se preocupe, esse link está comentado no seu google_maps_api.xml, então é só copiar e colar, como mostra a imagem abaixo:

Depois que inserir a api key onde diz YOUR API KEY HERE, mande rodar o seu app para que veja que ele já funciona, pinnando a localização de Sidney, na Australia. No entanto, é bem provável que seu emulador inicie, mas não rode o app, exibindo alguma mensagem como “your application relies on Google Play Services which is not supported by your device”, isso porque essas integrações com APIs do Google não funcionam em emuladores por padrão. Temos que criar um tipo especial de emulador para que funcione.

Criando o AVD com suporte a Google APIs

Primeiro, você terá de baixar o pacote Google APIs para a versão do Android que pretende emular, como a 5.1.1 na imagem abaixo:

Depois que baixar, você deverá criar um novo AVD, usando a versão “Google APIs” de Android, como mostra a imagem abaixo:

Já a imagem abaixo mostra a criação da mesma máquina, mas no Eclipse:

A primeira vez que executar esse AVD com Google APIs, ele provavelmente irá ficar parado um tempo atualizando com a mensagem “Google Play services are updating”. Aguarde até que termine e possa usá-lo corretamente (se ficar muito tempo travado nessa tela, experimente fechar apenas o Android Studio e abrir de novo, às vezes o ADB se perde).

Atenção: caso não esteja usando o emulador nativo do Android SDK (o que vem no Android Studio), usando ferramentas de terceiros como o Genymotion, por exemplo, não vai funcionar seu app de mapa. Para fazer funcionar nessas plataformas de terceiros, que não vem com o Google Play Services instalado, você vai precisar fazer mais alguns passos.

Exibindo o mapa

Depois que o AVD terminar de atualizar, e estiver plenamente funcionando apenas mande rodar seu app que você verá o mapa funcionando com um pin em Sidney, Australia.

O app está pinnando esta localização por causa desse trecho de código aqui, presente no método onMapReady da classe MapsActivity.java:

Ou seja, caso você fixe a latitude e longitude no construtor da variável sydney, o mapa irá pinnar o local informado, como abaixo, onde pinei -30, -51, próximo a Porto Alegre/RS.

‘Bora fazer ele pinnar sua localização atual?

Marcando a posição atual

Primeiro vamos pegar emprestado alguns códigos de outro tutorial aqui do blog, o Como criar um app Android com GPS, que ensina como pegar a localização atual do dispositivo em coordenadas geográficas (latitude e longitude).

No mesmo método onMapReady, vamos pegar as coordenadas geográficas atuais para instanciar o objeto corretamente, como abaixo:

Neste exemplo, usei um try/catch para suprimir a mensagem de erro de falta de permissão, desnecessária em Androids anteriores ao 6. Inclusive o próprio projeto já foi criado com a permissão de GPS devidamente adicionada no AndroidManifest.xml. Caso vá rodar este exemplo em um Android 6+, dê uma olhada na forma como pedi as permissões de GPS pro usuário corretamente no post sobre o GPS do Android.

Basicamente este código pega a informação de latitude e longitude atual fornecida pelo sensor de GPS e criar um marcador (pin, marker, etc) adicionando-o no mapa. Inclusive se você brincar via telnet com o seu emulador, consegue pinnar diversos locais usando o comandos geofix como abaixo:

O que acaba adicionando diversos pins no mapa. Mas como resolver isso?

Nessa variação final, eu adiciono apenas um marker, e vou atualizando ele conforme as coordenadas do GPS mudem, evitando os múltiplos pins no mapa (que podem ser úteis em algum projeto seu também). Por padrão, defini que o marker fica apontando para Porto Alegre/RS.

Lembrando que você pode alterar uma localização GPS fake no emulador facilmente pelos controles extendidos, usando as reticências na sidebar de apoio do emulador, conforme na imagem abaixo.

E por hoje é isso. O que achou deste tutorial? Funcionou para você? Deixe aí nos comentários a sua percepção!


banner-android

Os 7 livros de programação mais recomendados

Lembro que quando ainda era estudante de Ciência da Computação eu gostava muito de estudar usando livros pois passava horas por dia em ônibus. Em 2006 smartphones eram quase inexistentes (o iPhone só seria lançado no ano seguinte), os tablets ainda demorariam alguns anos para despontar e o que nos restava era o bom e velho livro de papel e tinta.

Uma dúvida comum que eu tinha na época era: qual livro é o melhor?

Lembro de entrar na biblioteca da Ulbra Gravataí, que não é nada imensa mas possui dois andares abarrotados de livros, e perder muito tempo pelas prateleiras de computação sem muita certeza do que pegar. Pior ainda quando ia em livrarias, pois o dinheiro era escasso e os títulos eram muitos. Pra complicar ainda mais, livros de programação são extremamente caros, na faixa dos R$100, e uma compra errada te prejudica financeiramente durante um bom tempo (não existiam ebooks como esses na época). 😛

Hoje, na função de professor, vez ou outra algum aluno me pede a indicação de algum livro. Quando condizente, acabo indicando algum de meus livros, mas nem sempre são a melhor opção, principalmente se o aluno quiser impresso (os meus são ebooks).

Recentemente o site Dev-Books.com analisou mais de 40 milhões de perguntas e respostas do site StackOverflow.com para descobrir os livros mais recomendados pelos programadores. Caso você ainda não conheça o StackOverflow.com ele é o maior site de perguntas e respostas sobre programação do mundo!

Para este post eu separei alguns itens da lista que eu confirmo como muito bons, seja porque eu li, ou porque alguém que eu confio leu e recomenda. A lista completa pode ser encontrada neste link (em Inglês).

Clique na capa de cada livro para ver os preços na Amazon.

#1 Padrões de Projeto: Soluções reutilizáveis de software orientado à objetos

Número dois na lista mundial de recomendações da Dev-Books.com, o clássico da Gang of Four que definiu e formalizou os padrões de software mais conhecidos e utilizados da indústria. Referência obrigatória em qualquer disciplina de padrões de projeto em faculdades mundo afora, é um livro denso e que eu não recomendo para iniciantes em software, mas que é livro de cabeceira para programadores plenos e sêniors que busquem se tornar ainda melhores.

Caso esteja começando agora a se tornar um programador e deseje uma leitura mais light (embora não tão completa), sugiro o Use a Cabeça: Padrões de Projeto, citado mais abaixo nesse post.

#2 Código Limpo: Habilidades Práticas do Agile Software

Clássico de Robert C. Martin, o Uncle Bob, Código Limpo é o#3 da lista mundial, sendo um livro objetivo, pragmático para escrever código melhor desde a sua concepção, produzindo softwares mais robustos e manuteníveis.

Confesso que nunca li este livro, embora tenha “bebido” de seu conteúdo diversas vezes através de suas técnicas universais e muito difundidas de escrita e refatoração de código, uma vez que o Tio Bob é uma referência mundial no assunto. Além disso, muitos programadores de confiança leram e recomendam para todos os níveis de programação!

#3 Domain Driven Design: Atacando as complexidades no coração do software

Outro clássico sobre padrões de projeto, #5 da lista mundial, especificamente sobre DDD: Domain Driven Design, ou projeto orientado à domínio.

Uma arquitetura de software muito difundida atualmente, o DDD também não é uma leitura muito fácil para iniciantes, mas obrigatória para engenheiros de software.

Também não conheci o DDD através desse livro, mas através de tutoriais e aulas na Internet. O que não diminui, no entanto, a sua importância enquanto instrumento de ensino.

#4 Padrões de Arquitetura de Aplicações Corporativas

Novamente, mais um livro de padrões de projeto, #7 da lista mundial. No entanto, diferente do DDD do Eric Evans e do Design Patterns da Gang of Four, este aqui eu recomendo para todos os públicos. Isso porque além de ser extremamente bem organizado, tem padrões com as mais variadas complexidades, muito objetivos, com exemplos muito claros e muito prático.

Diferente dos GoF Patterns, o catálogo PEAA (em alusão ao nome original, Patterns of Enterprise Applications Architecture) é muito mais prático e é difícil de encontrar um padrão em que você não tenha um bom exemplo de uso em mente, enquanto nos design patterns originais alguns soam muito específicos e com pouca utilidade para o modelo moderno de desenvolvimento de software.

#5 – Use a Cabeça: Padrões de Projeto

Esse sim é um livro de padrões de projeto para iniciantes!

Como todos os livros da série Use a Cabeça, essa edição é extremamente didática, pouco ortodoxa e muito prática. Enquanto os mais conservadores torcerão o nariz para o #10 da lista mundial, os mais jovens vão achar o máximo os exemplos utilizados, a estrutura do livro e o conhecimento que irão adquirir lendo essa imensa (e cara!) obra.

Tenho um grande apreço por esse livro pois foi com ele que finalmente consegui entender padrões de projeto para mais tarde poder ir atrás das fontes mais clássicas e me aprofundar no assunto.

#6 – TDD: Desenvolvimento Guiado por Testes

Talvez uma das maiores contribuições de Kent Beck para a humanidade, o #13 livro de programação mais recomendado mundialmente (#6 na minha lista). A metodologia TDD se une às suas demais invenções do autor, como a metodologia ágil XP, para nos trazer um mindset completamente oposto ao usual de programar > testar para testar > programar, focando o desenvolvimento nos requisitos do usuário e programando de “fora pra dentro”.

Este é um framework fácil de entender e muito difícil de ser dominado, semelhante ao que se enfrenta ao adotar o Scrum, mas mais especifico ao desenvolvimento de software em si. Vale a leitura ou ao menos (como eu) entender seus conceitos e tentar absorver o que puder.

#7 – Algoritmos: Teoria e Prática

O livro supremo de algoritmos e programação!

Muito usado por diversos professores ao redor do mundo para ensino de algoritmos em faculdades, o autor Thomas Cormen é uma lenda quando o assunto é este tópico e lembro de ter lido muito de seus materiais na época que fazia mestrado.

Embora eu não tenha lido especificamente este trabalho do autor que é o #14 mais recomendado do mundo, já li outro livro que é bem maior aliás e certamente é uma boa leitura para quem quiser dominar a base da programação e principalmente se quiser ensinar alguém um dia.

Note que nenhum dos livros fala de alguma tecnologia específica como Java ou C#, mas sim de conceitos e técnicas mais amplas, que são úteis a todos os programadores. Como já comentei em outras ocasiões, é a “base” que faz os programadores de verdade!

Bônus: Livros de Tecnologias Específicas

Devido à pedidos, atualizei o post com alguns livros que li e recomendo quando assunto é aprender alguma linguagem de programação ou tecnologia específica. Eles não estão em uma ordem específica, uma vez que citei apenas um por linguagem/plataforma.

Clique na capa para ver os preços dos livros na Amazon!

Java: Guia do Programador

Esse autor, o prof. Peter Jandl Junior, possui uma didática muito boa e me baseei muito na forma como explica os conceitos do Java quando escrevi o meu próprio livro sobre o assunto, o Java para Iniciantes. Na verdade eu literalmente aprendi Java com esse professor em 2006 e sou muito grato à ele por isso.

Google Android

O livro mais famoso de Android, do autor Ricardo Lecheta pela Editora Novatec. Eu poderia recomendar o meu livro também, o Criando apps para empresas com Android, mas nem se compararam ambos os livros (inclusive em preço :P).

C# 3.0: Guia de Bolso

Ok, nem de longe é o livro mais recente de C#, mas a didática é excelente. Vi que tem versões desse mesmo livro mais atuais, então dá uma procurada que você acha, é só se basear pela capa e pela editora: OReilly. Se um dia eu for escrever um livro de C#, certamente me basearei nesse aí. Me ajudou muito quando estava começando com essa linguagem em 2007.

Javascript: The Good Parts

Eu não li esse livro na verdade, mas está na minha lista desde que comecei a estudar Node.js com mais afinco. Foi uma recomendação de alguém que conheci em um evento e que entendia muito mais de Node.js que eu. Ele me afirmou que é excelente para realmente entender JS. Especificamente de JQuery tem um que eu recomendo muito que é o JQuery Fundamentals, que eu nunca mais encontrei.

Expressões Regulares: Uma Abordagem Divertida

Esse livro é fantástico e já fiz uma resenha completa dele aqui no blog. Mudou muito a forma coo passei a lidar com problemas de string e me ajudou a fundar minha primeira startup em 2010.

E aí, gostou da lista?

Tem alguma outra sugestão de livro que vale a recomendação?

Posta aí nos comentários!

Os 6 princípios mais importantes do Scrum

chicken-n-pigTrabalho com métodos ágeis desde 2010. De lá pra cá, nestes 7 anos de estrada, vejo muitas equipes falharem na adoção do framework, seja pela disciplina inerentemente necessária à essa tarefa, seja pela displicência das equipes em realmente “fazer acontecer”.

Sinceramente não acredito que o “Scrum flácido” seja o principal causador dessas falhas, mas sim uma “mentalidade flácida”. Não são raros os times que acham que colocar o Scrum Guide embaixo do braço vai resolver todos os seus problemas de entregas fora do prazo, escopo indefinido, falta de comprometimento e muito mais.

Muito mais do que decorar as regras do Scrum, neste post sugiro que você se foque em entender os 6 princípios mais importantes por trás dessa famosa metodologia. O Scrum não funciona apenas por ter reuniões de 15 minutos em pé todos os dias. Ele funciona por causa dos princípios por trás de cada um dos seus eventos, papéis e, porque não dizer, “excentricidades”.

Resumidamente, os princípios são:

  1. Empirismo
  2. Auto-organização
  3. Colaboração
  4. Priorização baseada em valor
  5. Time-boxing
  6. Iterativo-incremental

Princípio 1: Empirismo

Você sabe o que é algo ‘empírico’?

É algo advindo do conhecimento prático, o oposto de algo que só funciona na teoria, entende?

Scrum é um framework empírico, criado com base em décadas de experiência dos seus fundadores à frente de projetos de software e essa é a filosofia central dele. Não apenas você deve acreditar nos anos de experiência dos srs. Ken Schwaber e Jeff Sutherland como Scrum enfatiza que você aprenda com a sua experiência ao longo das sprints.

Transparência, inspeção e adaptação, os três pilares do Scrum, lembra?.

Após rodar algumas sprints (da maneira correta, fazendo reviews e retrospectivas), você começará a gerar o seu próprio conhecimento empírico, realimentado o framework e aumentado a qualidade dos seus processos.

Princípio 2: Auto-organização

Esse aqui talvez seja o ponto mais falho, uma vez que nem todo mundo tem a disciplina de se auto-organizar. O fato é que as pessoas entregam significativamente um maior valor quando são auto-organizadas e isto resulta em times mais satisfeitos e responsabilidade compartilhada; e em um ambiente inovador e criativo que é mais propício ao crescimento.

Lembra da fábula da “galinha e o porco” (ilustrada no início desse post)? #oldbutgold

A galinha queria abrir um restaurante com o porco, sugerindo o nome “Ovos com Presunto”. No entanto o porco recusou. Isso porque ele estaria comprometido, enquanto a galinha estaria meramente envolvida.

Auto-organização requer um comprometimento altíssimo com os demais membros do time e com a empresa. É um princípio fundamental não apenas para o Scrum, mas para a vida da gente.

Princípio 3: Colaboração

Esse princípio concentra-se nas três dimensões básicas relacionadas com o trabalho colaborativo: consciência, articulação e apropriação. Também defende o gerenciamento de projetos como um processo de criação de valor compartilhado, com times trabalhando e interagindo em conjunto para atingirem melhores resultados.

No livro As 17 incontestáveis leis do trabalho em equipe, de John Maxwell, a primeira lei é a Lei do Monte Everest. Ninguém jamais conseguiu subir o monte Everest sozinho. Sabe por quê? Porque quanto maior o objetivo, maior a necessidade de se trabalhar em equipe, de maneira colaborativa.

Quando o time é competitivo e/ou quando os membros são egoístas, o objetivo do grupo não é alcançado, e muitas vezes os pessoais também não.

Princípio 4: Priorização Baseada em Valor

Esse princípio destaca o foco do Scrum em entregar o máximo de valor de negócio possível, durante todo o projeto.

Quando falamos que Scrum é um framework para desenvolvimento de produtos complexos, que seu cerne é entregar valor de maneira frequente e com qualidade, não estamos falando necessariamente de software. Esse é apenas o uso mais comum do framework.

Entregar valor é atender a demanda do seu mercado. É resolver o problema do seu cliente.

Não tem nada a ver com fazer over-engineering ou escovar bits. Lembra-se do Manifesto Ágil? Software funcionando é mais importante do que documentação abrangente. Eu diria mais, cliente satisfeito é mais importante que usar a linguagem de programação da moda. Que valor é mais importante que tecnologia.

Princípio 5: Time-boxing

O tempo é considerado uma restrição limitada em Scrum, e que ele deve ser usado para ajudar a gerenciar o planejamento e execução do projeto com eficácia. Os elementos Time-boxed em Scrum incluem os Sprints, as Reuniões Diárias, a Reunião de Planejamento da Sprint, e a Reunião de Revisão da Sprint.

Na verdade não só no Scrum, mas o conceito de time-boxing deve ser levado para toda a vida, se você deseja ser mais produtivo.

O princípio de eventos com prazo e duração limitados norteia-nos para que os objetivos sejam atingidos de maneira eficaz e eficiente.

É duro dizer a um colega do time que ele estourou o tempo que tinha para falar na reunião diária. Mas tenha a certeza que da próxima vez ele será mais objetivo, se quiser ser ouvido por completo.

É triste muitas vezes o time falhar na entrega porque faltava “apenas” mais um dia para terminarem as features. Mas tenha a certeza que na próxima sprint eles aprenderão com esse erro e estimarão melhor as tarefas. Ou se descuidarão menos com distrações e imprevistos.

Princípio 6: Iterativo-Incremental

Muita gente confunde iterativo com interativo. E não é um typo, existe um ‘n’ a mais na segunda palavra.

Iteração é uma execução de um laço, uma repetição. Um desenvolvimento iterativo-incremental é aquele cujas etapas se repetem indefinidamente, e a cada iteração, um novo incremento do produto é entregue pronto.

Mesmo que não use Scrum, desenvolver produtos de maneira iterativa-incremental é sempre uma boa ideia. Iterações e colaboração com o cliente garantem uma entrega alinhada com a percepção de valor do cliente, o que por sua vez gera uma maior qualidade no projeto como um todo.

Mesmo que não use Scrum, aplicar estes princípios em seus projetos não faz mal à ninguém, muito pelo contrário, faz muito bem.

Até a próxima!

Para mais dicas, relatos e experiências práticas com Scrum, conheça o meu livro Scrum e Métodos Ágeis: Um Guia Prático.