Post on 02-Nov-2020
Guía N° 2 Universidad de El Salvador
2012 Página 1
Utilización de coordenadas espaciales para establecer la geo-
localización de un POI
Responsable
Ing. César Augusto González Rodríguez
Colaboradores
Bryan Josué Rodríguez Parada Alexandra María Cañas Tovar José Antonio Sánchez Delgado Luis Alejandro González
Taller
Sistema de geo localización de espacios físicos de la FIA
Requisitos de los participantes
Conocimientos básicos de JAVA y XML.
Preferiblemente un móvil (smartphone) con gps, Sistema operativo Android 2.2 o superior.
Duración del taller 2 horas
Universidad de El Salvador
Facultad de Ingeniería y Arquitectura
Escuela de Ingeniería en Sistemas
Programación en Dispositivos Móviles
Guía N° 2 Universidad de El Salvador
2012 Página 2
Comienzo del taller
En la sesión anterior realizamos la activity que permitía capturar una foto y al mismo tiempo
recuperarla a la activity principal. Por lo cual ahora desarrollaremos la activity que permita
extraer las coordenadas georeferenciales de un POI (Punto de Interés Especifico) y permita
mandarlas al servidor asignado. Por lo cual debemos acoplar al proyecto el siguiente código.
a) Visualización del XML
La interfaz de tu Activity se vera de la siguiente manera:
b) Complementar la Activity SendImageActivity
Luego pasaremos a complementar la activity SendImageActivity, añadiendo el código que se
presente a continuación al código que ya se tenía dentro de dicha Activity, según como se
indique:
Dentro de la clase, usted observara ciertos comentarios en donde se indica que deberá
agregar cierto código que se coloca correlativamente como código uno, código dos, código
tres, etc.
Guía N° 2 Universidad de El Salvador
2012 Página 3
1. Código uno: Agregar las librerías iniciales
import java.util.ArrayList;
import java.util.List
import com.gtworldmobile.classes.Uploader;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.SharedPreferences;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.CheckBox;
import android.widget.EditText;
2. Código 2: URL conexión con el servidor y creación de variables
private String URL = "";
private static String CREARPOI_SERVICES="GTWorld/CrearPoi";
public String ip_cargada= "";
String nombrePref = "preferencias";
List<String> parametros;
Button guardar;
Button obtenerDir;
Spinner tipo_poi;
TextView dirPath;
CheckBox checkbox_poi;
EditText nombre_poi;
EditText descripcion_poi;
EditText latitud_poi;
EditText longitud_poi;
EditText altitud_poi;
EditText url_poi;
TextView direccion_poi;
LocationManager locationManager;
private ProgressDialog progress;
private Activity crearPoi;
Uploader ups;
Guía N° 2 Universidad de El Salvador
2012 Página 4
3. Código 3: Obtención desde el SharedPreferences la ip utilizada para conexión
SharedPreferences prefs =
getSharedPreferences("preferencias",Context.MODE_PRIVATE);
ip_cargada= prefs.getString("ip", "");
URL=ip_cargada.concat(CREARPOI_SERVICES);
4. Código 4: Agregar el servicio de localización y uso de los componentes
crearPoi = this; locationManager = (LocationManager) this .getSystemService(Context.LOCATION_SERVICE); guardar = (Button) findViewById(R.id.boton_guardar_poi); obtenerDir = (Button) findViewById(R.id.obtener_dir); tipo_poi = (Spinner) findViewById(R.id.tipoPoi); nombre_poi = (EditText) findViewById(R.id.nombre_poi); url_poi = (EditText) findViewById(R.id.url_poi); descripcion_poi = (EditText) findViewById(R.id.descripcion_poi); checkbox_poi = (CheckBox) findViewById(R.id.checkbox_poi); latitud_poi = (EditText) findViewById(R.id.latitud_poi); longitud_poi = (EditText) findViewById(R.id.longitud_poi); altitud_poi = (EditText) findViewById(R.id.altitud_poi); direccion_poi = (TextView) findViewById(R.id.direccion_poi); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this, R.array.tipo_pois, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); tipo_poi.setAdapter(adapter); obtenerDir.setOnClickListener(onClickGenerico); guardar.setOnClickListener(onClickGenerico);
5. Código 5: Colocar la funcionalidad a los botones
Guía N° 2 Universidad de El Salvador
2012 Página 5
if (v.getId()==R.id.obtener_dir){
//Si el click lo dio el boton de guardar
poi....ejecutamos este codigo
Geocoder g = new Geocoder(getApplicationContext());
List<Address> ad = null;
try {
ad = g.getFromLocation(
Double.valueOf(latitud_poi.getText().toString()),
Double.valueOf(longitud_poi.getText().toString()), 1);
} catch (Exception e) {
e.printStackTrace();
}
if (ad != null && ad.isEmpty() == false) {
direccion_poi.setText(ad.get(0).getThoroughfare() +
","
+ ad.get(0).getSubAdminArea() + ","
+ ad.get(0).getCountryName());
}
//hasta aqui el codigo del clic a la obtencion de
direccion
}
if (v.getId()==R.id.boton_guardar_poi){
parametros = new ArrayList<String>();
// ----- VALIDAR CAMPOS----------------------------------
----
boolean valido = true;
if (nombre_poi.getText().toString().length() > 1)
parametros.add(nombre_poi.getText().toString());
else
valido = false;
parametros.add(descripcion_poi.getText().toString());
if (checkbox_poi.isChecked())
parametros.add("1");
else
parametros.add("0");
parametros.add(url_poi.getText().toString());
if (latitud_poi.getText().toString().length() > 0)
parametros.add(latitud_poi.getText().toString());
else
valido = false;
if (longitud_poi.getText().toString().length() > 0)
parametros.add(longitud_poi.getText().toString());
else
valido = false;
if (altitud_poi.getText().toString().length() > 0)
parametros.add(altitud_poi.getText().toString());
else
valido = false;
Guía N° 2 Universidad de El Salvador
2012 Página 6
// Obtener idUser de shared preferences
SharedPreferences prefs =
getSharedPreferences(nombrePref,
MODE_PRIVATE);
parametros.add(prefs.getString("id", ""));
//
...........................................................
parametros.add(String.valueOf((tipo_poi
.getSelectedItemPosition() + 1)));
if (direccion_poi.getText().toString().length() > 0)
parametros.add(direccion_poi.getText().toString());
else
parametros.add("No especificada");
if (valido) {
new EnviarDatos().execute();
} else {
Toast.makeText(SendImageActivity.this, "Campos no
validos",
Toast.LENGTH_LONG).show();
}
}
6. Código 6: Método de obtención de las coordenadas georeferenciales
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
latitud_poi.setText(String.valueOf(location.getLatitude()));
longitud_poi.setText(String.valueOf(location.getLongitude()));
altitud_poi.setText(String.valueOf(location.getAltitude()));
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
};
Guía N° 2 Universidad de El Salvador
2012 Página 7
7. Código 7: Método de onPause y onResume
@Override
public void onPause() {
super.onPause();
locationManager.removeUpdates(locationListener);
}
@Override
public void onResume() {
super.onResume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locationListener);
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0,
locationListener);
}
8. Código 8: Método de subida de datos public class EnviarDatos extends AsyncTask<Void, Void, Void> {
List<String> estatus = new ArrayList<String>();
protected void onPreExecute() {
progress = ProgressDialog.show(crearPoi, "Enviando...",
"Por favor espere", true);
}
protected void onPostExecute(Void p) {
progress.dismiss();
for (String msj : estatus)
Toast.makeText(SendImageActivity.this, msj,
Toast.LENGTH_LONG)
.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
ups = new Uploader(URL, filePath, fileName, parametros);
ups.uploadForm();
estatus.add(ups.getStatusForm());
if (filePath != null) {
ups.uploadImage();
estatus.add(ups.getStatusImage());
}
Guía N° 2 Universidad de El Salvador
2012 Página 8
} catch (Exception e) {
e.printStackTrace();
estatus.add(e.getMessage());
}
return null;
}
}
Observaciones:
La Activity SendImageActivity contiene los métodos para recuperar todos los datos que son de relevancia para crear el Punto de interés del Usuario. Además se hace uso del método LocationManager (uso gps) para la extracción de las coordenadas espaciales y ubicar así el POI georeferencialmente. Utilizando la clase Uploader la cual se explicara dentro del taller, pero no se digitará por cuestiones de tiempo; es la que nos permite comunicarnos con el servidor y probar de esta manera que nuestro POI ha sido guardado dentro de la base de datos del sistema GTWORLD.
c) Descripción de la clase Uploader. Java Descripción clase Upload.java
Clase que se encarga de enviar un mensaje HTTP POST a un servicio web y opcionalmente
subir un archivo de imagen.
Este mensaje contiene los valores para almacenar un nuevo Poi en la Base de Datos. Para ello
se utiliza el método uploadForm() de la clases Upload.java así como se muestra a
continuación.
Guía N° 2 Universidad de El Salvador
2012 Página 9
Primero se crea un objeto HttpClient que permitirá ejecutar una petición al servidor, y uno HttpPost que será dicha petición POST a ejecutar. Se crea una lista de elementos NameValuePair, que se enviaran como parámetro en el mensaje HTTP POST. Cada uno de estos elementos contiene la información necesaria para que el servidor cree un nuevo Poi y lo almacene en la BD. Con el listado de elementos NameValuePair se construye y se asigna una entidad (Entity) al objeto HttpPost.
Guía N° 2 Universidad de El Salvador
2012 Página 10
Se le asigna un encabezado al objeto HttpPost, y se realiza la petición con el método execute() del HttpClient. Se captura la respuesta del servidor que deberá contener, si no existió error alguno, el ID del Poi creado. Ahora se ejecuta el método uploadImage() si, y solo si existe una imagen para enviar.
Guía N° 2 Universidad de El Salvador
2012 Página 11
La diferencia de esta petición es que la Entidad es ahora del tipo MultipartEntity, que permite
enviar un archivo como mensaje HTTP POST. Dicho archivo se especifica con la variable
filePath, que contiene la dirección de la imagen dentro de la tarjeta SD.
En el encabezado se asigna el ID del Poi al que se le asociara la imagen.
Al ejecutar la petición POST, si todo se realizó correctamente el servidor regresara como Respuesta “Su Foto ha sido guardada” Por ultimo si tienes algún error en tu aplicación consulta a uno de los encargados para auxiliarte. Y por ultimo si tienes tu dispositivo móvil prueba la aplicación y crear tu Primer punto de Interés.
Guía N° 2 Universidad de El Salvador
2012 Página 12
d) Ejemplo de la aplicación a desarrollar
Observar la siguiente secuencia:
Crear un nuevo POI
Elige el tipo de POI
Toma la foto del POI
Coloca una descripción del POI
Envie sus datos al servidor y espere por favor
Por ultimo espere a que se le notifique que sus datos y su foto ha sido guardada con
éxito