serviços baseados em localização (LBS) utilizando dados GPS (dados geométricos de lattitude-longitude-altura) e a classe javax.microedition.location de J2ME (JSR 179). Como é um assunto pouco discutido, queria amostrar um exemplo para começar
ilustração da posição física do dispositivo móvel.
para dispositivos móveis
// classes de uso do j2me
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.location.*;
public class locationMidlet extends Midlet implements CommandListener {
// criação do comando sair
Command cmExit = new Command("Sair",Command.EXIT,0);
Command cmPesquisar = new Command("Pesquisar", Command.SCREEN, 2);
private String lat = "";
private String long = "";
private String alt = "";
private String met = "";
public locationMidlet() {}
public void startApp() {
// criação do formulário com titulo
Form f=new Form("Esperando...");
// subtitulo
f.append("Procurando por localização...");
// amostrará o resultado da consulta do servlet LBS
StringItem siLocalidade = new StringItem("", "");
String ErroMsg = new String("");
String lat = new String("");
String long = new String("");
String alt = new String("");
String met = new String("");
// adiciona comando ao formulário
f.addCommand(cmExit);
// gerenciador de comandos
f.setCommandListener(this);
Display.getDisplay(this).setCurrent(f);
thread tGetLocation = new thread(){
public void run(){
try{
// obtêm uma instância da classe Location
LocationProvider lp=LocationProvider.getInstance(c);
// pega a localização com tempo limite de 60s
Location loc=lp.getLocation(60);
}
catch(LocationException e){
f.append("Exception: "+e);
}
catch(InterruptedException e){
f.append("Exception: "+e);
}
}
};
try {
// obtêm uma instancia um criteria
Criteria c=new Criteria();
// Precisão de 1000m horizontalmente e verticalmente
c.setHorizontalAccuracy(100);
c.setVerticalAccuracy(100);
// ajusta o nível máximo preferido do consumo de potência (pouco uso)
c.setPreferredPowerConsumption(Criteria.POWER_USAGE_LOW);
AlertType.INFO.playSound(m_Display);
tGetLocation.start();
tGetLocation.join();
f.append(found(loc)+"location");
// obtêm uma instancia um Qualified Coordinates que representa as coordenadas
QualifiedCoordinates qc=loc.getQualifiedCoordinates();
// uso das informações de coordenadas, vincula (exibição) ao formulario (display)
// Caso haja coordenadas de localização
if((qc != null) || (location.isValid())) {
// obtêm a latitude
lat = Coordinates.convert(qc.getLatitude(), Coordinates.DD_MM_SS), "");
// obtêm a longitude
long = Coordinates.convert(qc.getLongitude(), Coordinates.DD_MM_SS), "");
// obtêm a altura
alt = Coordinates.convert(qc.getAltitude(), Coordinates.DD_MM_SS), "");
String locate = c.convert(alt,1);
// obtêm a método de localização
met = location.getLocationMethod();
// exibe a altura
f.append("Altura: "+lat);
// exibe a latitude
f.append("Latitude: "+long);
// exibe a longitude
f.append("Longitude: "+alt);
// exibe o método
f.append("Método: "+met);
// exibe a localizadde
f.append(siLocalidade);
// atualiza o display
display.setCurrent(f);
}
else{
// caso a localização ou as coordenadas não é valida.
String msg = location.getExtraInfo(“application/X-jsr179-location-nmea”);
f.append("Localização não válida: "+msg);
}
// tratamento de erro,
} catch(Exception e) {
f.append("Exception: "+e);
}
}
// função orbigatoria do midlet (pausa)
public void pauseApp() {}
// função orbigatoria do midlet (saida)
public void destroyApp(boolean destroy) {}
// gerenciador de ação (comando)
public void commandAction(Command c, Displayable s) {
if (c == cmExit) {
destroyApp(true);
notifyDestroyed();
}
else if (c == cmPesquisar) {
PesquisarGet();
}
}
// Acesso ao Servlet Usando metodo Get
public void PesquisarGet() throws IOException {
// Criação dos elementos HttpConnection e InputStream utilizados numa conexão do tipo GET
HttpConnection hc = null;
InputStream is = null;
boolean ret = false;
thread tConnection = new thread(){
public void run(){
// Inicializa uma conexão
hc = (HttpConnection) Connector.open(url);
hc.setRequestMethod(HttpConnection.GET);
}
};
// Definição de URL que enviara os dados (coordenadas) para a pesquisa
String url = "http://ENDEREÇO_DO_SERVLET:8080/" + "?" + "latitude=" + lat + "&longitude=" + long
try{
// Inicializa uma conexão
AlertType.INFO.playSound(m_Display);
tConnection.start();
tConnection.join();
// Inicia o InputStream para troca de mensagens
is = hc.openInputStream();
ret = processResposta(hc, is)
}
finally{
if (is != null)
// Finaliza conexão
is.close();
if (hc != null)
hc.close();
}
if(ret == false)
showAlert(erroMsg);
}
// Processa uma reposta do Servlet
public boolean processResposta(HttpConnection hc, InputStream is) throws IOException {
erroMsg = null;
// se conexão realizada e resposta OK enviada, calcula o tamanho da resposta (resultado)
if(hc.getResponseCode() == HttpConnection.HTTP_OK){
int length = (int) hc.getLength();
string str;
if(length != -1){
byte servletData[] = new Byte[lenght];
// recebe resposta do servlet e depois guarda em str
is.read(servletData);
str = new string(servletData);
}
else{
ByteArrayOutputstream bos = new ByteArrayOutputstream();
int ch;
while(ch = is.read() != -1)
bos.write(ch);
str = new String(bos.toByteArray());
bos.close()
}
// amostra o resultado (resposta do servlet) no display
siLocalidade.setText(str);
return true;
}
else{
erroMsg = new String(hc.getResponseMessage());
return false;
}
// Mostra alerta
private Void showAlerta(String msg){
alErro = new Alert("Erro", msg, null, AlertType.ERROR);
alErro.setTimeout(Alert.FOREVER);
display.setCurrent(alErro, fmPrincipal);
}
} fim da classe locationMidlet
Código para usa ro GPS no desktop
import javax.microedition.location;
//...
void findLatLong(){
LocationProvider lp = LocationProvider.getInstance(null);
Location loc = lp.getLocation(10);
QualifiedCoordinate qc = LocationProvider.getInstance(
new Criteria()).getLastKnownLocation().getQualifiedCoordinates() ;
String exinf = l.getExtraInfo("text/plain");
System.out.println("A palavra é... " + exinf);
if ((qc != null) || (location.isValid()){
double latitude = qc.getLatitude();
double longitude = qc.getLongitude();
String locate = c.convert(alt,1);
graphics.drawString(locate,4,30,Graphics.TOP|Graphics.LEFT);
System.out.println("Latitude: " + latitude);
System.out.println("Longitude: " + longitude);
System.out.println("Método: "+location.getLocationMethod());
else{
// caso a localização ou coordenadas não é valida.
String msg = location.getExtraInfo(“application/X-jsr179-location-nmea”);
System.out.println(“Localização não valida: ”+msg);
}
}
Código da classe do servlet (servidor web) que receberá as coordenadas (dados gps) e realizará a consulta
Classe do servlet
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class gpsServlet extends HttpServlet {
// Procedimento doGet (recebimento de solicitação do cliente)
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// Captura os dados passados por parametro atraves do endereço URL
String latitude = request.getParameter("latitude"),
longitude = request.getParameter("longitude");
String localidade = pesquisaLocal(latitude, longitude);
// se resultado vazio, amostra msg de erro
if(localidade == null){
res.SendError(res.SC_BAD_REQUEST, "Nao possivel localizar o local");
return;
}
res.SendContentType("text/plain");
// Inicializa o objeto PrintWriter que vai escrever(enviar pro dispositivo) a resposta
PrintWriter out = res.getWriter();
out.print(localidade);
out.close();
desconectar();
}
// Pesquisa num banco de dados
public String pesquisaLocal(String latitude, String longitude){
Connection conn = null;
Statement st = null;
StringBuffer msgb = new StringBuffer("");
// commando básico de pesquisa em um BD
String sql = Select LOCALIDADE From DADOS_LOCALIDADE Where latitude = " + latitude + "And longitude = " + longitude + "'"
try{
// informações sobre o BD ussado ,no caso hsqldb
Class.forName("org.hsqldb.jdbcDriver");
// nome do usuário (login), senha e endereço url do BD
String user = "sa";
String password = "";
String url = "jdbc:hsqldb:hsql://localhost";
conn = DriverManager.getConnection(url,user,password);
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery(sql);
// retorna o resultado da pesquisa
if(rs.next())
return rs.getString(1);
else
resturn null;
}
// Erro ao acessar o banco de dados
catch(ClassNotFoundException e) {
resp = "* ERRO: BANCO DE DADOS INACESSIVEL! ";
// e.printStackTrace(); // Esta linha iria imprimir no console informações sobre o erro obtido
}
// Erro ao executar a consulta sql
catch(SQLException e) {
resp = "* ERRO: CONSULTA SQL INVÁLIDA!";
// e.printStackTrace();
}
}
// Finaliza a conexão com o banco de dados
public void desconectar() throws SQLException {
this.conn.close();
}
}
Abraço Elias.Lôgan-X