public void onLocationChanged(Location location) { l = location; checkGoodEnough(l.getExtras()); }
public void onLocationChanged(Location loc) { /** * Hemos obtenido una nueva localización 1. Comprobar si es una localización válida 1.1. Que * no sea null. 1.2. Que tenga precisión suficiente. 2. Si la localización es válida. 2.1. * Enviar la localización al servidor OPEN GTS 2.2. Graba la posición en la base de datos. * 2.3. Comprobar el número de puntos en la db y si es superior a maxNumRegistrosEnDb entonces * hay que exportar los puntos al fichero de texto de la SDcard y luego borrar los registros * de la base de datos 3. Actualizar variables de "lastLocation" y los contadores de puntos * obtenidos, puntos enviados, puntos rechazados y puntos en la db 4. Enviar los datos a los * clientes UI registrados. */ // Para poder obtener la hora GregorianCalendar greg = new GregorianCalendar(TimeZone.getTimeZone("Europe/Madrid")); DateFormat timestampFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String fechaHora = timestampFormat.format(greg.getTime()); // La fecha y hora del sistema en el momento que hemos la posición // 1. Comprobar si es una localización válida // 1.1. Que no sea null. if (loc != null) { boolean pointIsRecorded = false; int cuantosRegistros; try { // 1.2. Que tenga precisión suficiente. // TODO, determinar si programamos que al estar en modo intensivo // la precisión (accuracy) se tenga que comprobar o cualquiera // nos vale // 1.2.1 Si estamos en modo intensivo, cualquier accuracy nos vale // De momento no pedimos que tenga al menos minAccuracyMeters // TODO, hay que deja el IF como sigue y quita el if (true) // if (loc.hasAccuracy() // && loc.getAccuracy() <= minAccuracyMeters) { // Para hacer debug en el emulador dejamos pasar todos los puntos if (true) { pointIsRecorded = true; // 2. Si la localización es válida. // 2.1. Enviar la localización al servidor OPEN GTS String url = "http://" + getServerName() + getGprmcName() + "acct=" + getAccountName() + "&" + "dev=" + getDeviceName() + "&" + "gprmc=" + OpenGTSutils.GPRMCEncode(loc); Log.i(tag, "URL: " + url); AsyncHttpClient client = new AsyncHttpClient(); client.get( url, new AsyncHttpResponseHandler() { @Override public void onStart() { Log.i(tag, "AsyncHttpClient onStart"); } @Override public void onSuccess(String response) { Log.i(tag, "AsyncHttpClient SUCCESS " + response); cntEnviados++; } @Override public void onFailure(Throwable e, String response) { Log.i(tag, "AsyncHttpClient FAILURE " + response); } @Override public void onFinish() { Log.i(tag, "AsyncHttpClient onFinish"); } }); // 2.2. Graba la posición en la base de datos. DbPointsManager punto = new DbPointsManager( timestampFormat.format(loc.getTime()), loc.getLatitude(), loc.getLongitude(), loc.hasAltitude() ? loc.getAltitude() : 0.0, loc.hasAccuracy() ? loc.getAccuracy() : 0.0, loc.hasSpeed() ? loc.getSpeed() : 0.0, loc.hasBearing() ? loc.getBearing() : 0.0, false); // TODO, de momento el ultimo campo "puntoEnviado", sera false, hasta que // incorporemos un sistema para poder controlar que puntos se han podido enviar // y cuales no. db.addDbPoint(punto); // Saber cuantos registros hay en la base de datos cuantosRegistros = db.getDbPointsCount(); Log.d(tag, "Reg #: " + cuantosRegistros + " Max #: " + maxNumRegistrosEnDb); // * 2.3. Comprobar el número de puntos en la db y si es superior a maxNumRegistrosEnDb // * entonces hay que exportar los puntos al fichero de texto de la SDcard y // * luego borrar los registros de la base de datos if (cuantosRegistros > maxNumRegistrosEnDb) { if (db.doDbExport(deviceName) > 0) { // * 2.3.1 Se ha exportado los datos pues ahora borrar el // * contenido de la tabla "points" de la base de datos int i; i = db.deleteDbPointAll(); Log.d(tag, "Se borraron " + i + "PUNTOS"); } } Log.i(tag, "addDbPoint: " + punto.toString()); } } catch (Exception e) { Log.e(tag, e.toString()); } finally { // Si estamos aqui algo ha ido mal así que ... /* Este código en principio no es necesario if (db.isOpen()) db.close(); */ } // Toast if (pointIsRecorded) { cntObtenidos++; /* TODO if (showingDebugToast) Toast.makeText( getBaseContext(), "Location stored: \nLat: " + sevenSigDigits.format(loc .getLatitude()) + " \nLon: " + sevenSigDigits.format(loc .getLongitude()) + " \nAlt: " + (loc.hasAltitude() ? loc .getAltitude() + "m" : "?") + "\nVel: " + (loc.hasSpeed() ? loc.getSpeed() + "m" : "?") + " \nAcc: " + (loc.hasAccuracy() ? loc .getAccuracy() + "m" : "?"), Toast.LENGTH_LONG).show(); */ } else { cntRechazados++; /* TODO if (showingDebugToast) Toast.makeText( getBaseContext(), "Location not accurate enough: \nLat: " + sevenSigDigits.format(loc .getLatitude()) + " \nLon: " + sevenSigDigits.format(loc .getLongitude()) + " \nAlt: " + (loc.hasAltitude() ? loc .getAltitude() + "m" : "?") + "\nVel: " + (loc.hasSpeed() ? loc.getSpeed() + "m" : "?") + " \nAcc: " + (loc.hasAccuracy() ? loc .getAccuracy() + "m" : "?"), Toast.LENGTH_LONG).show(); */ } } // 3. Actualizar variables de "lastLocation" y // los contadores de puntos obtenidos, puntos enviados, puntos rechazados // Poner la fecha en YYMMDD HH:MM:SS StringBuffer buf = new StringBuffer(timestampFormat.format(loc.getTime())); buf.insert(4, '-'); buf.insert(7, '-'); buf.insert(10, ' '); buf.insert(13, ':'); buf.insert(16, ':'); // buf.append('Z'); setLastDateTime(buf.toString()); setLastLatitude(String.format("%1.6f", loc.getLatitude())); setLastLongitude(String.format("%1.6f", loc.getLongitude())); setLastAccuracy((loc.hasAccuracy() ? String.format("%1.0f", loc.getAccuracy()) + "m" : "?")); setLastAltitude((loc.hasAltitude() ? String.format("%1.0f", loc.getAltitude()) + "m" : "?")); setLastSpeed((loc.hasSpeed() ? String.format("%1.0f", loc.getSpeed()) + "m/s" : "?")); setLastSpeed( getLastSpeed() + " " + (loc.hasSpeed() ? String.format("%1.0f", loc.getSpeed() * 3.6) + "km/s" : "?")); Bundle extras = loc.getExtras(); if (extras != null) { setLastSatellites( extras.containsKey("satellites") ? extras.get("satellites").toString() : "0"); Log.d(tag, "sat: " + getLastSatellites()); } else Log.d(tag, "sat: extras es null"); // Guardar el objeto de la última localización setLastLoc(loc); // Guardar el número de registros en la base de datos para luego actualizar el UI setLastPointCounter(db.getDbPointsCount()); // 4. Enviar los datos a los clientes UI registrados. sendMessageToUI(); }