SlideShare uma empresa Scribd logo
1 de 6
Baixar para ler offline
Acessando banco de dados remoto com Android
11. agosto 2014 luizfduartejr Android, BD, Java, Mobile (0)
Share
Este tutorial estava há tempos para ser escrito e na verdade é muito mais simples do que a maioria dos
desenvolvedores pensam. Programadores Java em geral estão acostumados a utilizar o framework JDBC para realizar
conexões aos seus bancos de dados favoritos como MySQL e SQL Server, diretamente. Entretanto, o Android não
oferece suporte nativo à conexões remotas em SGBDs e este tipo de conexão deve ser realizado através de uma API.
AAPI
Como o intuito deste post não é ensinar como criar uma API, que neste exemplo nada mais é do que um webservice,
usaremos uma API pronta. O site http://freegeoip.net oferece uma API aberta e gratuita para descobrir a
geolocalização de um dispositivo com base em seu endereço IP. Ou seja, você informa o IP e a API deles retorna um
JSON, CSV ou XML com os dados de localização, quando encontrados.
Você pode testar a API fazendo chamadas a http://freegeoip.net/formato/seu_ip onde 'formato' deve ser substituído
por json, csv ou xml e 'seu_ip' deve ser substituído pelo IP que deseja consultar, ou nada, para consultar a localização
do seu IP atual. Neste exemplo usaremos a URL http://freegeoip.net/json/8.8.8.8 que é o IP do servidor de DNS do
Google, na Califórnia.
Mas o que isso tem a ver com acesso a bancos de dados remotos, você deve estar se perguntando. O FreeGeoIP nada
mais é do que uma base de dados remota onde seus desenvolvedores criaram um webservice REST para consulta de
dados a a partir de qualquer plataforma, ou seja, eles permitem através da API que qualquer um possa acessar seu
banco de dados, e é exatamente isso que um desenvolvedor Android necessita fazer para integrar de maneira prática e
eficiente um banco de dados remoto ao seu app.
O APP
O primeiro passo é abrir nossa ferramenta, o Android Studio. Outras ferramentas possíveis incluem o ADT Bundle e
o NetBeans com suporte à Android. Mande criar um novo projeto do tipo Android Application e lhe dê o nome de
LocationApp. A versão de Android fica ao seu gosto, enquanto eu utilizei a versão 4.0 em meus testes, oferecendo
compatibilidade com toda a família IceCream Sandwich e posteriores, incluindo o Android Kit Kat (4.4).
Crie uma Blank Activity chamada LocationActivity que herdará da Activity base e que criará ao mesmo tempo o
arquivo de layout activity_location.xml na pasta de layouts. Crie seu layout de maneira bem simples, usandos widgets
padrões do Android SDK como TextViews, EditText e Button, como mostra o trecho de código abaixo (devido a
problemas em meu plugin, está tudo em minúsculo):
?
1
2
3
4
5
6
7
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingleft="@dimen/activity_horizontal_margin"
android:paddingright="@dimen/activity_horizontal_margin"
android:paddingtop="@dimen/activity_vertical_margin"
android:paddingbottom="@dimen/activity_vertical_margin"
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
tools:context=".LocationActivity">
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textappearance="?
android:attr/textAppearanceLarge" android:text="IP:" android:id="@+id/lblIP"
android:layout_alignparenttop="true" android:layout_alignparentleft="true"
android:layout_alignparentstart="true">
</textview>
<edittext android:layout_width="200dp"
android:layout_height="wrap_content" android:text="177.155.44.231"
android:inputtype="number" android:ems="10" android:id="@+id/txtIP"
android:layout_alignparenttop="true" android:layout_torightof="@+id/lblIP">
</edittext>
<button android:layout_width="100dp" android:layout_height="wrap_content"
android:text="Carregar" android:id="@+id/btnCarregar"
android:onclick="carregarLocalizacao" android:layout_alignparenttop="true"
android:layout_torightof="@+id/txtIP">
</button>
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textappearance="?
android:attr/textAppearanceLarge" android:text="Geolocalização"
android:textstyle="bold" android:id="@+id/lblTitulo"
android:layout_below="@+id/lblIP" android:layout_alignparentleft="true"
android:layout_margintop="30dp">
</textview>
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textappearance="?
android:attr/textAppearanceLarge" android:text="País: Brazil"
android:id="@+id/lblCountry" android:layout_below="@+id/lblTitulo"
android:layout_margintop="10dp" android:layout_alignparentleft="true"
android:layout_alignparentstart="true">
</textview>
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textappearance="?
android:attr/textAppearanceLarge" android:text="Estado: Rio Grande do Sul"
android:id="@+id/lblRegion" android:layout_below="@+id/lblCountry"
android:layout_margintop="10dp" android:layout_alignparentleft="true"
android:layout_alignparentstart="true">
</textview>
<textview android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textappearance="?
android:attr/textAppearanceLarge" android:text="Cidade: Gravataí"
android:id="@+id/lblCity" android:layout_below="@+id/lblRegion"
android:layout_margintop="10dp" android:layout_alignparentleft="true"
android:layout_alignparentstart="true">
</textview>
</relativelayout>
O layout pretendido é esse:
Com o layout criado, é hora de começar a programar nossa Activity, fazendo o binding de cada widget com variáveis
de mesmo tipo, como mostra o trecho de código abaixo que fica no evento onCreate da Activity.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
EditText txtIP;
TextView lblCountry, lblRegion, lblCity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
//permite conexão com a Internet na Thread principal
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
//carrega os controles da interface para objetos
txtIP = (EditText)findViewById(R.id.txtIP);
lblCountry = (TextView)findViewById(R.id.lblCountry);
lblRegion = (TextView)findViewById(R.id.lblRegion);
lblCity = (TextView)findViewById(R.id.lblCity);
}
O próximo passo é criar uma classe para consumir a API do FreeGeoIP.net, que chamamos de ClienteGeoIP, além de
uma classe para representar o objeto Localizacao do nosso app, que possui as referidas informações que queremos
exibir na tela. A classe ClienteGeoIP conecta-se na API usando um cliente HTTP e convertendo o retorno para o
formato JSON, usando as bibliotecas nativas do Android.
Primeiro a classe Localizacao.java:
?
Agora a classe ClienteGeoIP e seu único método que consome a API:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.json.*;
import java.io.IOException;
public class ClienteGeoIP {
public static Localizacao retornarLocalizacaoPorIp(String ip) throws
IOException, JSONException {
HttpClient client = new DefaultHttpClient();
HttpGet getMethod=new HttpGet("http://freegeoip.net/json/" + ip);
ResponseHandler<string> responseHandler = new BasicResponseHandler();
String responseBody = client.execute(getMethod, responseHandler);
JSONObject obj = new JSONObject(responseBody);
String pais = obj.get("country_name").toString();
String estado = obj.get("region_name").toString();
String cidade = obj.get("city").toString();
return new Localizacao(pais, estado, cidade);
}
}
</string>
Com o método de retornar localização criado, devemos definir o método do evento OnClick do botão de carregar a
localização da nossa LocationActivity (note que existe uma chamada a um evento carregarLocalizacao no XML do
Button). Esse método deve ser declarado na LocationActivity, logo abaixo do evento onCreate:
?
1
2
3
4
5
6
7
8
9
10
11
public void carregarLocalizacao(View view){
try {
Localizacao localizacao =
ClienteGeoIP.retornarLocalizacaoPorIp(txtIP.getText().toString());
lblRegion.setText("Estado: " + localizacao.getRegion());
lblCity.setText("Cidade: " + localizacao.getCity());
lblCountry.setText("País: " + localizacao.getCountry());
}
catch(Exception ex){
Toast.makeText(getBaseContext(), ex.getMessage(),
Toast.LENGTH_LONG).show();
}
}
Não esqueçamos que uma vez que vamos conectar à Internet precisamos informar essa permissão no
AndroidManifest.xml, conforme mostrado abaixo.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--?xml version="1.0" encoding="utf-8"?-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.luiztools.geolocalizacao">
<application android:allowbackup="true"
android:icon="@drawable/ic_launcher" android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".LocationActivity"
android:label="@string/title_activity_location">
<intent-filter>
<action android:name="android.intent.action.MAIN"></action>
<category
android:name="android.intent.category.LAUNCHER"></category>
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET">
</uses-permission></manifest>
Testando nosso app em um AVD conseguimos ver que ele funciona perfeitamente e com isso encerramos mais este
breve tutorial. Um abraço.
Acessando banco de dados remoto com Android

Mais conteúdo relacionado

Destaque (12)

Guia
GuiaGuia
Guia
 
Tema 7
Tema 7Tema 7
Tema 7
 
Catálogo Gamboa
Catálogo GamboaCatálogo Gamboa
Catálogo Gamboa
 
Jorge luis borges
Jorge luis borgesJorge luis borges
Jorge luis borges
 
Christian vera
Christian veraChristian vera
Christian vera
 
Projecto CCE - 7 de Julho 2011 (Completo)
Projecto CCE - 7 de Julho 2011 (Completo)Projecto CCE - 7 de Julho 2011 (Completo)
Projecto CCE - 7 de Julho 2011 (Completo)
 
ENERGY CONSERVATION TIPS
ENERGY CONSERVATION TIPSENERGY CONSERVATION TIPS
ENERGY CONSERVATION TIPS
 
Conoce lo que Te Ofrecemos!!
Conoce lo que Te Ofrecemos!!Conoce lo que Te Ofrecemos!!
Conoce lo que Te Ofrecemos!!
 
e-Kikus.com Ayuda a la Venta en Empresas_LQ2
e-Kikus.com Ayuda a la Venta en Empresas_LQ2e-Kikus.com Ayuda a la Venta en Empresas_LQ2
e-Kikus.com Ayuda a la Venta en Empresas_LQ2
 
Aprendizaje colaborativo
Aprendizaje colaborativoAprendizaje colaborativo
Aprendizaje colaborativo
 
steven jobs
steven jobssteven jobs
steven jobs
 
Romb
RombRomb
Romb
 

Semelhante a Acessando banco de dados remoto com Android

Data Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidData Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidVinícius Thiengo
 
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEM
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEMMinicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEM
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEMAlisson Solitto
 
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.xDicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.xRodrigo Kono
 
Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TVAécio Costa
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Android Core Aula 6 - Desenvolvimento de aplicações Android
Android Core Aula 6 -  Desenvolvimento de aplicações AndroidAndroid Core Aula 6 -  Desenvolvimento de aplicações Android
Android Core Aula 6 - Desenvolvimento de aplicações AndroidFelipe Silveira
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.jsDenis Velrino
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Erisvaldo Junior
 
Ementa do curso Desenvolvimento web com Brook framework 3.0
Ementa do curso Desenvolvimento web com Brook framework 3.0Ementa do curso Desenvolvimento web com Brook framework 3.0
Ementa do curso Desenvolvimento web com Brook framework 3.0Silvio Clecio
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosphelypploch
 
Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi SaturninoLevi Saturnino
 
Android About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela SobreAndroid About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela SobreVinícius Thiengo
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemRodrigo Valerio
 
Curso Java (Parte 8) Web Service REST
Curso Java (Parte 8) Web Service RESTCurso Java (Parte 8) Web Service REST
Curso Java (Parte 8) Web Service RESTMario Sergio
 
2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao androidMessias Batista
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 

Semelhante a Acessando banco de dados remoto com Android (20)

Data Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI AndroidData Binding Para Vinculo de Dados na UI Android
Data Binding Para Vinculo de Dados na UI Android
 
Oficina Sesc Android - V1
Oficina Sesc Android - V1Oficina Sesc Android - V1
Oficina Sesc Android - V1
 
PHP no Google AppEngine
PHP no Google AppEnginePHP no Google AppEngine
PHP no Google AppEngine
 
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEM
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEMMinicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEM
Minicurso WebAPI .NET CORE - SemanaTI2018 - UNIVEM
 
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.xDicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
Dicas para migrar sua aplicação ASP.NET para ASP.NET Core 2.x
 
Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TV
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Android Core Aula 6 - Desenvolvimento de aplicações Android
Android Core Aula 6 -  Desenvolvimento de aplicações AndroidAndroid Core Aula 6 -  Desenvolvimento de aplicações Android
Android Core Aula 6 - Desenvolvimento de aplicações Android
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.js
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
 
Ementa do curso Desenvolvimento web com Brook framework 3.0
Ementa do curso Desenvolvimento web com Brook framework 3.0Ementa do curso Desenvolvimento web com Brook framework 3.0
Ementa do curso Desenvolvimento web com Brook framework 3.0
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
 
Data Binding Android - Levi Saturnino
Data Binding  Android - Levi SaturninoData Binding  Android - Levi Saturnino
Data Binding Android - Levi Saturnino
 
Android About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela SobreAndroid About Page API Para Construir a Tela Sobre
Android About Page API Para Construir a Tela Sobre
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvem
 
Curso Java (Parte 8) Web Service REST
Curso Java (Parte 8) Web Service RESTCurso Java (Parte 8) Web Service REST
Curso Java (Parte 8) Web Service REST
 
2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android2017 08-11 - Androidos V - Minicurso - Introdução ao android
2017 08-11 - Androidos V - Minicurso - Introdução ao android
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Java no Google App Engine - TDC2011
Java no Google App Engine - TDC2011Java no Google App Engine - TDC2011
Java no Google App Engine - TDC2011
 

Acessando banco de dados remoto com Android

  • 1. Acessando banco de dados remoto com Android 11. agosto 2014 luizfduartejr Android, BD, Java, Mobile (0) Share Este tutorial estava há tempos para ser escrito e na verdade é muito mais simples do que a maioria dos desenvolvedores pensam. Programadores Java em geral estão acostumados a utilizar o framework JDBC para realizar conexões aos seus bancos de dados favoritos como MySQL e SQL Server, diretamente. Entretanto, o Android não oferece suporte nativo à conexões remotas em SGBDs e este tipo de conexão deve ser realizado através de uma API. AAPI Como o intuito deste post não é ensinar como criar uma API, que neste exemplo nada mais é do que um webservice, usaremos uma API pronta. O site http://freegeoip.net oferece uma API aberta e gratuita para descobrir a geolocalização de um dispositivo com base em seu endereço IP. Ou seja, você informa o IP e a API deles retorna um JSON, CSV ou XML com os dados de localização, quando encontrados. Você pode testar a API fazendo chamadas a http://freegeoip.net/formato/seu_ip onde 'formato' deve ser substituído por json, csv ou xml e 'seu_ip' deve ser substituído pelo IP que deseja consultar, ou nada, para consultar a localização do seu IP atual. Neste exemplo usaremos a URL http://freegeoip.net/json/8.8.8.8 que é o IP do servidor de DNS do Google, na Califórnia. Mas o que isso tem a ver com acesso a bancos de dados remotos, você deve estar se perguntando. O FreeGeoIP nada mais é do que uma base de dados remota onde seus desenvolvedores criaram um webservice REST para consulta de dados a a partir de qualquer plataforma, ou seja, eles permitem através da API que qualquer um possa acessar seu banco de dados, e é exatamente isso que um desenvolvedor Android necessita fazer para integrar de maneira prática e eficiente um banco de dados remoto ao seu app. O APP O primeiro passo é abrir nossa ferramenta, o Android Studio. Outras ferramentas possíveis incluem o ADT Bundle e o NetBeans com suporte à Android. Mande criar um novo projeto do tipo Android Application e lhe dê o nome de LocationApp. A versão de Android fica ao seu gosto, enquanto eu utilizei a versão 4.0 em meus testes, oferecendo compatibilidade com toda a família IceCream Sandwich e posteriores, incluindo o Android Kit Kat (4.4). Crie uma Blank Activity chamada LocationActivity que herdará da Activity base e que criará ao mesmo tempo o arquivo de layout activity_location.xml na pasta de layouts. Crie seu layout de maneira bem simples, usandos widgets padrões do Android SDK como TextViews, EditText e Button, como mostra o trecho de código abaixo (devido a problemas em meu plugin, está tudo em minúsculo): ? 1 2 3 4 5 6 7 <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" android:paddingbottom="@dimen/activity_vertical_margin"
  • 2. 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 tools:context=".LocationActivity"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:textappearance="? android:attr/textAppearanceLarge" android:text="IP:" android:id="@+id/lblIP" android:layout_alignparenttop="true" android:layout_alignparentleft="true" android:layout_alignparentstart="true"> </textview> <edittext android:layout_width="200dp" android:layout_height="wrap_content" android:text="177.155.44.231" android:inputtype="number" android:ems="10" android:id="@+id/txtIP" android:layout_alignparenttop="true" android:layout_torightof="@+id/lblIP"> </edittext> <button android:layout_width="100dp" android:layout_height="wrap_content" android:text="Carregar" android:id="@+id/btnCarregar" android:onclick="carregarLocalizacao" android:layout_alignparenttop="true" android:layout_torightof="@+id/txtIP"> </button> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:textappearance="? android:attr/textAppearanceLarge" android:text="Geolocalização" android:textstyle="bold" android:id="@+id/lblTitulo" android:layout_below="@+id/lblIP" android:layout_alignparentleft="true" android:layout_margintop="30dp"> </textview> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:textappearance="? android:attr/textAppearanceLarge" android:text="País: Brazil" android:id="@+id/lblCountry" android:layout_below="@+id/lblTitulo" android:layout_margintop="10dp" android:layout_alignparentleft="true" android:layout_alignparentstart="true"> </textview> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:textappearance="? android:attr/textAppearanceLarge" android:text="Estado: Rio Grande do Sul" android:id="@+id/lblRegion" android:layout_below="@+id/lblCountry" android:layout_margintop="10dp" android:layout_alignparentleft="true" android:layout_alignparentstart="true"> </textview> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:textappearance="? android:attr/textAppearanceLarge" android:text="Cidade: Gravataí" android:id="@+id/lblCity" android:layout_below="@+id/lblRegion" android:layout_margintop="10dp" android:layout_alignparentleft="true" android:layout_alignparentstart="true"> </textview>
  • 3. </relativelayout> O layout pretendido é esse: Com o layout criado, é hora de começar a programar nossa Activity, fazendo o binding de cada widget com variáveis de mesmo tipo, como mostra o trecho de código abaixo que fica no evento onCreate da Activity. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 EditText txtIP; TextView lblCountry, lblRegion, lblCity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location); //permite conexão com a Internet na Thread principal StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); //carrega os controles da interface para objetos txtIP = (EditText)findViewById(R.id.txtIP); lblCountry = (TextView)findViewById(R.id.lblCountry); lblRegion = (TextView)findViewById(R.id.lblRegion); lblCity = (TextView)findViewById(R.id.lblCity); } O próximo passo é criar uma classe para consumir a API do FreeGeoIP.net, que chamamos de ClienteGeoIP, além de uma classe para representar o objeto Localizacao do nosso app, que possui as referidas informações que queremos exibir na tela. A classe ClienteGeoIP conecta-se na API usando um cliente HTTP e convertendo o retorno para o formato JSON, usando as bibliotecas nativas do Android. Primeiro a classe Localizacao.java:
  • 4. ? Agora a classe ClienteGeoIP e seu único método que consome a API: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import org.apache.http.client.*; import org.apache.http.client.methods.*; import org.apache.http.impl.client.*; import org.json.*; import java.io.IOException; public class ClienteGeoIP { public static Localizacao retornarLocalizacaoPorIp(String ip) throws IOException, JSONException { HttpClient client = new DefaultHttpClient(); HttpGet getMethod=new HttpGet("http://freegeoip.net/json/" + ip); ResponseHandler<string> responseHandler = new BasicResponseHandler(); String responseBody = client.execute(getMethod, responseHandler); JSONObject obj = new JSONObject(responseBody); String pais = obj.get("country_name").toString(); String estado = obj.get("region_name").toString(); String cidade = obj.get("city").toString(); return new Localizacao(pais, estado, cidade); } } </string> Com o método de retornar localização criado, devemos definir o método do evento OnClick do botão de carregar a localização da nossa LocationActivity (note que existe uma chamada a um evento carregarLocalizacao no XML do Button). Esse método deve ser declarado na LocationActivity, logo abaixo do evento onCreate:
  • 5. ? 1 2 3 4 5 6 7 8 9 10 11 public void carregarLocalizacao(View view){ try { Localizacao localizacao = ClienteGeoIP.retornarLocalizacaoPorIp(txtIP.getText().toString()); lblRegion.setText("Estado: " + localizacao.getRegion()); lblCity.setText("Cidade: " + localizacao.getCity()); lblCountry.setText("País: " + localizacao.getCountry()); } catch(Exception ex){ Toast.makeText(getBaseContext(), ex.getMessage(), Toast.LENGTH_LONG).show(); } } Não esqueçamos que uma vez que vamos conectar à Internet precisamos informar essa permissão no AndroidManifest.xml, conforme mostrado abaixo. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!--?xml version="1.0" encoding="utf-8"?--> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.luiztools.geolocalizacao"> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".LocationActivity" android:label="@string/title_activity_location"> <intent-filter> <action android:name="android.intent.action.MAIN"></action> <category android:name="android.intent.category.LAUNCHER"></category> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"> </uses-permission></manifest> Testando nosso app em um AVD conseguimos ver que ele funciona perfeitamente e com isso encerramos mais este breve tutorial. Um abraço.