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