Este documento descreve como acessar um banco de dados remoto de geolocalização usando Android. Ele explica como criar um aplicativo simples que consome uma API gratuita para obter o país, estado e cidade de um endereço IP inserido. O aplicativo usa classes para representar os dados e se conectar à API, exibindo os resultados em tela após o clique em um botão.
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"
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.