Download Tutorial appGPSQR_JMNM_JALG

Document related concepts
no text concepts found
Transcript
Práctica 3. Android.
Tutorial appGPSQR
José Antonio Larrubia García
José Miguel Navarro Moreno
Índice:
1.- Introducción.
2.- Descripción de la solución y problemas encontrados.
3.- Manual de uso.
4.- Referencias.
1.- Introducción.
Esta aplicación consiste en leer un código QR que contendrán unas coordenadas, luego se mostrará
la ruta de la localización actual hasta esas coordenadas, una vez terminado el recorrido se podrá
consultar.
2.- Descripción de la solución y problemas encontrados.
Partiendo de un proyecto “Blank Activity” de Android Studio, lo primero lo primero es leer el
código QR, para ello hemos usado las clases IntentInterator e IntentResult obtenidas de [1] y [2]
respectivamente, entonces, se añaden esas clases al proyecto.
Para lanzar un Intent con la clase IntentInterator se hace lo siguiente:
new IntentIntegrator(MainActivity.this).initiateScan();
Esto se ejecuta al pulsar un botón, de forma que queda como sigue:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Se crea el inter que llama al lector de códigos QR.
new IntentIntegrator(MainActivity.this).initiateScan();
}
});
Los resultados generados tras finalizar el IntertIntegrator se obtienen en el método
onActivityResult , para ello se usa la otra clase, IntentResult, como se indica en [3].
IntentResult scanResult = IntentIntegrator.parseActivityResult(
requestCode, resultCode, data);
String coordenadas = scanResult.getContents();
De esta forma tendremos los datos del código QR en un string. El onActivityResult que de la
siguiente forma:
public void onActivityResult(int requestCode,int resultCode,Intent data) {
switch (requestCode) {
case IntentIntegrator.REQUEST_CODE: {
if (resultCode == RESULT_CANCELED) {
} else {
//Recogemos los datos que nos envio el código Qr
IntentResult scanResult = IntentIntegrator.parseActivityResult (
requestCode, resultCode, data);
String coordenadas = scanResult.getContents();
//partimos el string del código QR por "_" y nos quedamos con el
//segundo elemento y el último que serán los números de las
//coordenadas.
String[] res = coordenadas.split("_");
if (res.length >= 4) {
latitud = Double.parseDouble(res[1]);
longitud = Double.parseDouble(res[3]);
}
x.setText(latitud + "");
y.setText(longitud + "");
}
break;
}
}
}
Una vez que tenemos las coordenada, se procede a lanzar el mapa para ver la ruta a seguir y guardar
el recorrido para mostrarlo luego.
Lo primero es iniciar el LocationManager para manejar los eventos de localización en el método
onCreate():
LocationManager lm;
//Se crea el LocationManager.
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
//Se crea el LocationListener para capturar los eventos de cambio de posición.
LocationListener ll = new mylocationListener();
//Iniciamos el LocationManager con el locationListener
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
//Para obtener la última posicion conocida.
Criteria criteria = new Criteria();
criteria.setAccuracy(criteria.ACCURACY_FINE);
String proveedor = lm.getBestProvider(criteria, true);
La clase myLocationListener es una clase que hereda de Locationlistener que solo tiene
implementado el método onLocationChanged, que se encarga de guardar las localizaciones del
recorrido para poder mostrarlo al final:
@Override
public void onLocationChanged(Location location) {
if(pos_ant==null){
pos_ant=location;
recorrido.add(location);
}
if(abs(pos_ant.getLongitude()-location.getLongitude())>0.0004 ||
abs(pos_ant.getLatitude()-location.getLatitude())>0.0004) {
recorrido.add(location);
pos_ant=location;
}
}
Para mostrar la ruta que hay que seguir hasta la localización objetivo se crea un Intent de Google
Maps para la ruta desde la posición actual hasta el objetivo,y este método se ejecuta al pulsar un
botón:
private void mostrarRuta() {
Location pos = lm.getLastKnownLocation(proveedor);
recorrido.clear();
recorrido.add(pos);
//Se crea el Uri para el intent.
String uri = String.format(Locale.ENGLISH, "https://www.google.es/maps/dir/
%f,%f/%f,%f/",pos.getLatitude(),pos.getLongitude(),latitud,longitud);
//Se crea el intent con el Uri anterior
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
//Para que se abra con Google Maps
intent.setClassName("com.google.android.apps.maps",
"com.google.android.maps.MapsActivity");
//Se inicia el intent
this.startActivity(intent);
}
Una vez que se llega a la localización objetivo, se puede mostrar el recorrido seguido pulsando otro
botón, que ejecutara el siguiente método:
private void mostrarRecorrido() {
Location pos = lm.getLastKnownLocation(proveedor);
recorrido.add(pos);
String direccion = "https://www.google.com/maps/dir/";
for (Location l : recorrido) {
direccion += l.getLatitude() + "," + l.getLongitude() + "/";
}
//Se crea el Uri para el Intent
String uri = String.format(Locale.ENGLISH, direccion);
intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
//Para que se abra con Google Maps
intent.setClassName("com.google.android.apps.maps",
"com.google.android.maps.MapsActivity");
//Se inicia el Intent
this.startActivity(intent);
}
El código completo se encuentra en: https://github.com/JMNM/appGPSQR
3.- Manual de uso.
Una vez iniciada la aplicación, leer un código QR de unas coordenadas pulsando el botón de la
esquina inferior derecha, cuando hayas leído el código QR se pulsa el botón “Mostrar Ruta” para
que te indique la ruta ha seguir, una vez finalizada la ruta, vuelve a la aplicación y pulsando el botón
“Mostrar Recorrido” podrás ver el recorrido que has realizado.
4.- Referencias.
[1] https://github.com/zxing/zxing/blob/master/androidintegration/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java
[2] https://github.com/zxing/zxing/blob/master/androidintegration/src/main/java/com/google/zxing/integration/android/IntentResult.java
[3] https://github.com/zxing/zxing/wiki/Scanning-Via-Intent
[4] http://www.iteramos.com/pregunta/28346/como-abrir-la-aplicacion-estandar-de-google-map-demi-aplicacion
[5] http://www.sgoliver.net/blog/localizacion-geografica-en-android-i/
[6]https://github.com/SitoRBJ/NPI/blob/master/Geolocalizacion/src/com/GPS/geolocalizacion/Mai
nActivity.java