sexta-feira, 12 de julho de 2013

Android – Conhecendo a API do Google Maps


Em se tratando do Google, uma empresa que dispensa comentários e vem se tornando uma das maiores do mundo no seu ramo de negócio, sempre nos disponibilizou inovações tecnológicas e de ponta. Um dos recursos que podemos englobar no desenvolvimento para Android seria o uso das denominadas “APIs” (Application Programming Interface ou Interface de Programação de Aplicativos), em poucas palavras, uma “API” seria a forma que temos de nos comunicar com as funções pré-programadas pelo fabricante, no nosso caso o Google. Neste artigo abordarei a “API” do “Google Maps”, sendo que a mesma nos permite a criação de mapas com locais definidos, diversos tipos de controle como o de Zoom, tipos de mapas, geração de rotas, implementação de pesquisas, entre outras coisas.

Trabalharemos com a versão 1.0, mas é importante salientar que o próprio Google já disponibilizou outras versões com algumas funcionalidades a mais que discutiremos em artigos futuros. Reforçando, este artigo irá abranger todas as etapas desde a obtenção, cadastro e acesso da versão 1.0 (que por sinal está muito estável) , ou seja, este artigo não servirá de base para versões superiores desta API.

Antes de começarmos a programar, teremos que passar por um processo um tanto burocrático e chato. Todo acesso ao servidor do Google exige uma Identificação (uma chave única de acesso) para evitar múltiplos acessos desnecessários. Para obtermos esta chave devemos informar outra chave presente em nossa aplicação Android, denominada chave de Debug. Em seguida descreverei detalhadamente estas duas etapas.

1-) Obtendo o certificado digital MD5

Ao executar algum projeto desenvolvido no emulador do Eclipse a chave de debug deverá ser encontrada por padrão no diretório:

-       Windows Seven:  C:\Users\<user>\.android\debug.keystore
-       Windows XP:  C:\Documents and Settings\<user>\.android\debug.keystore

<user> deverá ser entendido como a pasta do usuário. Caso não encontre neste diretório recomendo conferir no Eclipse clicando no item de Menu “Window/Preferences/Android/Build” e na opção “Default Debug Keystore” poderá conferir o diretório em questão. Ver Imagem 01 para maiores detalhes.

Figura 01: Diretório Padrão “debug.keystore”.

A próxima etapa executaremos o comando “KeyTool” no ”prompt” do DOS para descobrir o que desejamos, o certificado MD5. É neste exato momento que usaremos o diretório padrão descoberto anteriormente. O comando “KeyTool” é um programa instalado junto ao JDK. Para isto execute a linha de código no diretório Bin do Java, Veja a seguir:

C:\Arquivos de Programas\java\jdk1.7.0_01\bin>keytool –list -v -keystore C:\Users\Thiago\.android\debug.keystore

Caso necessite informar alguma senha de armazenamento de chaves deixe em branco pressionando “Enter”. Aparecerá uma mensagem informativa e logo em seguida diversos tipos de certificados. Localize a linha “(MD5 do certificado)” e anote esta seqüência alfanumérica de 47 caracteres. 

Trecho da listagem mais importante:

***************** Advertência **********************
Fingerprints do certificado:
MD5: 11:04:EC:BE:C9:72:DC:B2:3D:B3:25:AA:BB:CC:DD:EE
****************************************************

Este certificado digital é único, ressaltando que cada desenvolvedor deverá possuir o seu.

2-) Obtendo a chave de registro da API “Google Maps”

Primeiramente é necessário ter um usuário e senha no Google para obtermos a chave de registro. Segue o link para acesso


O próprio site nos informa a existência de outras versões da API, mas neste caso estaremos utilizando a versão 1.0 sendo necessário seguir os passos adiante. Leia atentamente os termos e condições de uso marcando a opção “I have read and agree with the terms and conditionspara aceitar os termos determinados. Na opção My certificate's MD5 fingerprintinsira o certificado MD5 obtido anteriormente e para finalizar esta etapa clique no botão “Generate API Key”. Ver Imagem 03.

Figura 03: Gerando a Chave de registro da API “Google Maps”.


Na próxima tela teremos uma mensagem informativa indicando a chave válida para todos os aplicativos assinados com o certificado digital MD5 e um exemplo de uso no em um layout XML. Esta chave deverá possuir 40 caracteres alfanuméricos.

Conhecendo as Classes

1-) com.google.android.maps.MapActivity

MapActivity é a classe base da API Google, possui o código para gerenciar as necessidades de qualquer atividade que apresenta um “MapView” incluindo o gerenciamento do ciclo de atividades do aplicativo como: OnCreate(), OnResume(), OnPause() e OnDestroy().


2-) com.google.android.maps.GeoPoint

Uma classe imutável representando um par de latitude e longitude, armazenados como números inteiros. Os principais métodos são: getLatitudeE6() e o getLongitudeE6() que retornam a latitude e Longitude deste “GeoPoint” em “microdegrees” (graus * 1E6).

A notação “microdegrees” se refere a um grau multiplicado por 1E6 e apenas numérico, sem decimais. O número 1E6 é a mesma coisa que 1.000.000, onde o 6 significa que existem 6 zeros à esquerda.

Exemplo de conversão:

int latitude = (int) (latitude*1E6);

3-) com.google.android.maps.MapController

Esta classe disponibiliza recursos para controlar a navegação pelo mapa, além do controle de detalhamento. Os principais métodos são: ZoomIn() e ZomOut() Servindo para aumentar e diminuir a visualização da área centralizada no mapa, setZoom(int level) para indicar o nível de detalhe de visualização do mapa e o setCenter(Geopoint point) centraliza a visualização do mapa na coordenada informada.

4-) com.google.android.maps.MapView

A Classe MapView encapsula todo o código necessário para realizar a comunicação com o GoogleMaps, por este motivo que esta classe recebe como parâmetro no seu construtor a chave de licença para utilização do serviço, sendo seus principais métodos o getController() que retorna um objeto MapController permitindo executar controle de zoom e navegação pelo mapa e setBuiltInZoomControls() recebe um valor booleano para habillitar/desabilitar controles de zoom clicando no mapa.

Criando um exemplo Prático

Depois de entendermos algumas das principais classes, iremos por a mão na massa criando um exemplo para carregar o Mapa do Google e alterar suas coordenadas pela latitude e longitude nos mostrando o lugar de destino. Antes de tudo, para trabalhar com a API do Google Maps é necessário possuir instalado o pacote “Google Play Services” localizado na aba “Extras” e “Google Api” na aba da versão do Android em questão (Para este exemplo foi usado a versão 2.2). Para executar esta tarefa abra o “Android SDK Manager” fazendo a instalação destes pacotes. Ver Imagem 05.

Figura 05: Instalação dos Pacotes.

Faremos um pouco diferente dos outros artigos, usaremos a biblioteca “Google Api”, instalado anteriormente, os passos são os mesmos, alterando apenas este detalhe. Clique em “File/New/Android Project” preenchendo com as seguintes configurações:

Em “Project name” defina como: “Google_api_v1”, logo em seguida em “Contents” marque o item “Create new Project in workspace”. Utilizamos a plataforma 2.2 deixando como padrão o Build Target como “Google APIs”. Nas propriedades defina um nome para aplicação em “Application Name” como “Google_api_v1”  e para o pacote como “pct.Google_api_v1”. Marque o item “Create Activity” e em “Min SDK Version” use a versão 8. Clique em “Finish” para encerrar esta etapa, Ver Imagem 06.

Figura 06: Configurações Iniciais.   

Alterando o arquivo “AndroidManifest”

No caso do “Google Maps”, deveremos dar permissão ao aplicativo para acesso a internet usando a tag “uses-permission” e acesso a biblioteca com a “uses library”. Estas configurações serão realizadas dentro do arquivo de configuração “AndroidManifest.xml”.

Para Permissão de acesso a internet:

<uses-permission android:name="android.permission.INTERNET" />

Para permitir acesso a biblioteca do Google Maps:

<uses-library android:name="com.google.android.maps" />

Segue em seguida a listagem completa:



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="pct.Google_maps"
      android:versionCode="1"
      android:versionName="1.0">
   <uses-permission android:name="android.permission.INTERNET" />
   <uses-sdk android:minSdkVersion="8" />
   <application android:icon="@drawable/icon" android:label="@string/app_name">
   <uses-library android:name="com.google.android.maps" />
        <activity android:name=".Google_mapsActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Criando o lay-Out  

  A tela deverá possuir 2 TextViews, 2 EditTexts, 1 Button e 1 MapView dispostos na tela.  Ver Imagem 07.
Figura 07: Lay-Out de exemplo.

O XML Correspondente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <LinearLayout android:id="@+id/linearLayout4"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="1">
        <LinearLayout android:id="@+id/linearLayout3"
        android:orientation="vertical"
        android:layout_height="wrap_content"
        android:layout_width="168dp">
            <TextView android:layout_width="wrap_content"
            android:text="Latitude:"
            android:layout_height="wrap_content"
            android:id="@+id/txtLatitude">
            </TextView>
            <EditText android:layout_width="150dp"
            android:id="@+id/edtLatitude"
            android:layout_height="wrap_content">
            </EditText>
        </LinearLayout>
        <LinearLayout android:id="@+id/linearLayout1"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
            <TextView android:layout_width="wrap_content"
            android:text="Longitude:"
            android:layout_height="wrap_content"
            android:id="@+id/txtLongitude">
            </TextView>
            <EditText android:layout_width="150dp"
            android:id="@+id/edtLongitude"
            android:layout_height="wrap_content">
            </EditText>
        </LinearLayout>
    </LinearLayout>
    <Button android:text="Localizar"
    android:id="@+id/btnLocalizar"
    android:layout_width="116dp"
    android:gravity="center"
    android:layout_gravity="center"
    android:layout_height="35dp"
    android:onClick="Localizar">
    </Button>
     <com.google.android.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="0AOvUFOH7B4e1mBLmq1cEkgCMwk_AABBC_CDDEE"/>   
 </LinearLayout>

A parte que devemos dar uma ênfase maior seria o local onde inserimos a chave da Api obtida anteriormente passando o valor através da tag “apiKey”, confira abaixo:
     
android:apiKey="0AOvUFOH7B4e1mBLmq1cEkgCMwk_AABBC_CDDEE"

Codificando o exemplo

Explicarei detalhadamente todas as etapas efetuadas, sendo que o primeiro passo seria importar as bibliotecas necessárias.

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class Google_mapsActivity extends MapActivity
{   
     private GeoPoint ponto;
     private MapView  mapView;
     private EditText edtLatitude, edtLongitude;


A classe principal herdará da MapActivity utilizando a cláusula “extends”. A variável “ponto” controlará as coordenadas do mapa, a “mapView” encapsula todo o código necessário para realizar a comunicação com o GoogleMaps usando o método GetController(). Já o “edtLatitude” e “edtLongitude” para trabalharmos com os valores de latitude e longitude.
     
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        InicializaListeners();
        mapView.setBuiltInZoomControls(true);
    }

No evento OnCreate() executaremos o método “InicializaListeners” para atribuir as variáveis utilizadas ao decorrer do aplicativo e passamos um valor “true” no método “setBuildZoomControls()”. Este responsável por habilitar o controle de Zoom ao clicar em qualquer lugar do mapa.
   
    public void InicializaListeners()
    {
    mapView = (MapView) findViewById(R.id.mapview);
    edtLatitude = (EditText) findViewById(R.id.edtLatitude);
      edtLongitude = (EditText) findViewById(R.id.edtLongitude);
    }
   
Inicialização das variáveis atribuídas pelo “id” dos componentes.

    public void Localizar(View v)
    {   
double latitude = Double.parseDouble(edtLatitude.getText().toString());
double longitude = Double.parseDouble(edtLongitude.getText().toString());
   
ponto = new GeoPoint((int)(latitude * 1e6), (int)(longitude * 1e6));
    MapController mControler = mapView.getController();
    mControler.animateTo(ponto);
    }

O método Localizar() está fazendo referência ao botão criado anteriormente, sendo que o mesmo irá obter os valores da latitude e longitude, usando uma variável do tipo “GeoPoint()” realizando as transformações necessárias. Para aplicar as localizações usaremos um objeto do tipo “MapController”.

    @Override
    protected boolean isRouteDisplayed()
    {
     return false;
    }

Finalmente temos o método sobrescrito “isRouteDisplayed()” que retorna um booleano para informar se algum tipo de rota está sendo visualizada. Este método é obrigatório em se tratando da classe “MapActivity”.

}

Podemos conferir o exemplo em “Run-Time” na Imagem 08.

Figura 08: Exemplo Localizando pela Latitude e Longitude.

Ao clicar sobre o mapa temos o controle de Zoom para (+) ou para (-). Ver Imagem 09.

Figura 09: Controle de Zoom.

Conclusões

No desenvolvimento para o Sistema Android podemos integrar muitas funcionalidades interessantes, como por exemplo o uso desta API do Google Maps. Procurei neste artigo explorar todas as etapas para implementar os recursos desta poderosa API criada pelo Google. Estes mecanismos estão cada vez mais presentes nos softwares atuais de dispositivos móveis, abrindo um leque de possibilidades ao desenvolvedor Móbile e também Web. Fica aí a dica meus amigos, um abraço e até o mês que vem!

Referências


  

Nenhum comentário:

Postar um comentário