// // GpsHelper.java // GpsTracker // // Created by Nick Fox on 11/7/13. // Copyright (c) 2013 Nick Fox. All rights reserved. // package com.websmithing.gpstracker; import javax.microedition.location.*; import java.util.Calendar; import java.util.Date; public class GpsHelper implements LocationListener { private LocationProvider locationProvider = null; private Coordinates oldCoordinates = null, currentCoordinates = null; private float distance = 0; private int azimuth = 0; private String uploadWebsite; private GpsTracker midlet; private int interval; protected Calendar currentTime; protected long sessionID; public GpsHelper(GpsTracker Midlet, int Interval, String UploadWebsite){ currentTime = Calendar.getInstance(); sessionID = System.currentTimeMillis(); this.midlet = Midlet; this.interval = Interval; this.uploadWebsite = UploadWebsite; } // getting the gps location is based on an interval in seconds. for instance, // the location is gotten once a minute, sent to the website to be stored in // the DB (and then viewed on Google map) and used to retrieve a map tile (image) // to be diplayed on the phone public void startGPS() { if (locationProvider == null) { createLocationProvider(); Thread locationThread = new Thread() { public void run(){ createLocationListener(); } }; locationThread.start(); } } // this allows us to change how often the gps location is gotten public void changeInterval(int Interval) { if (locationProvider != null) { locationProvider.setLocationListener(this, Interval, -1, -1); } } private void createLocationProvider() { Criteria cr = new Criteria(); try { locationProvider = LocationProvider.getInstance(cr); } catch (Exception e) { midlet.log("GPS.createLocationProvider: " + e); } } private void createLocationListener(){ // 2cd value is interval in seconds try { locationProvider.setLocationListener(this, interval, -1, -1); } catch (Exception e) { midlet.log("GPS.createLocationListener: " + e); } } public void locationUpdated(LocationProvider provider, final Location location) { // get new location from locationProvider try { Thread getLocationThread = new Thread(){ public void run(){ getLocation(location); } }; getLocationThread.start(); } catch (Exception e) { midlet.log("GPS.locationUpdated: " + e); } } public void providerStateChanged(LocationProvider provider, int newState) {} private void getLocation(Location location){ float speed = 0; try { QualifiedCoordinates qualifiedCoordinates = location.getQualifiedCoordinates(); qualifiedCoordinates.getLatitude(); if (oldCoordinates == null){ oldCoordinates = new Coordinates(qualifiedCoordinates.getLatitude(), qualifiedCoordinates.getLongitude(), qualifiedCoordinates.getAltitude()); } else { if (!Float.isNaN( qualifiedCoordinates.distance(oldCoordinates))) { distance += qualifiedCoordinates.distance(oldCoordinates); } currentCoordinates = new Coordinates(qualifiedCoordinates.getLatitude(), qualifiedCoordinates.getLongitude(), qualifiedCoordinates.getAltitude()); azimuth = (int)oldCoordinates.azimuthTo(currentCoordinates); oldCoordinates.setAltitude(qualifiedCoordinates.getAltitude()); oldCoordinates.setLatitude(qualifiedCoordinates.getLatitude()); oldCoordinates.setLongitude(qualifiedCoordinates.getLongitude()); } if (qualifiedCoordinates != null){ Date d = new Date(); if (!Float.isNaN(location.getSpeed())) { speed = location.getSpeed(); } String gpsData = "lat=" + String.valueOf(qualifiedCoordinates.getLatitude()) + "&lng=" + String.valueOf(qualifiedCoordinates.getLongitude()) + "&mph=" + String.valueOf((int)(speed/1609*3600)) // in miles per hour + "&dir=" + String.valueOf(azimuth) + "&dt=2008-04-17%2012:07:02" // + d.toString() + "&lm=" + location.getLocationMethod() + "&dis=" + String.valueOf((int)(distance/1609)) // in miles + "&pn=" + midlet.phoneNumber + "&sid=" + String.valueOf(sessionID) // guid? + "&acc=" + String.valueOf((int)(qualifiedCoordinates.getHorizontalAccuracy()*3.28)) // in feet + "&iv=yes" + "&info=javaMe-" + location.getExtraInfo("text/plain"); // with our query string built, we create a networker object to send the // gps data to our website and update the DB NetWorker netWorker = new NetWorker(midlet, uploadWebsite); netWorker.postGpsData(gpsData); } } catch (Exception e) { midlet.log("GPS.getLocation: " + e); } } }