Note that there are some explanatory texts on larger screens.

plurals
  1. POhow to keep application running in background? keep collecting data?
    primarykey
    data
    text
    <p>UPDATED AT BOTTOM</p> <p>I have written an application that logs the users position, current speed, average speed and top speed. I would like to know how to make the application do the following things:</p> <ol> <li>prevent the screen from turning off while it is open on the screen</li> <li>if the user opens another app or returns to the home screen, gets a call etc, the app should keep collecting data (or would it be better to just write all data to a database everytime the location is updated? and maybe have a button to signify when to start and stop collecting data?)</li> </ol> <p>here is the code that I have written. (feel free to use it if you want and if you have any recommendations on how I might improve it I am very open to constructive criticism :D )</p> <pre><code>package Hartford.gps; import java.math.BigDecimal; import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; public class GPSMain extends Activity implements LocationListener { LocationManager locationManager; LocationListener locationListener; //text views to display latitude and longitude TextView latituteField; TextView longitudeField; TextView currentSpeedField; TextView kmphSpeedField; TextView avgSpeedField; TextView avgKmphField; //objects to store positional information protected double lat; protected double lon; //objects to store values for current and average speed protected double currentSpeed; protected double kmphSpeed; protected double avgSpeed; protected double avgKmph; protected double totalSpeed; protected double totalKmph; //counter that is incremented every time a new position is received, used to calculate average speed int counter = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); run(); } @Override public void onResume() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this); super.onResume(); } @Override public void onPause() { locationManager.removeUpdates(this); super.onPause(); } private void run(){ final Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setSpeedRequired(true); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); //Acquire a reference to the system Location Manager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); // Define a listener that responds to location updates locationListener = new LocationListener() { public void onLocationChanged(Location newLocation) { counter++; //current speed fo the gps device currentSpeed = round(newLocation.getSpeed(),3,BigDecimal.ROUND_HALF_UP); kmphSpeed = round((currentSpeed*3.6),3,BigDecimal.ROUND_HALF_UP); //all speeds added together totalSpeed = totalSpeed + currentSpeed; totalKmph = totalKmph + kmphSpeed; //calculates average speed avgSpeed = round(totalSpeed/counter,3,BigDecimal.ROUND_HALF_UP); avgKmph = round(totalKmph/counter,3,BigDecimal.ROUND_HALF_UP); //gets position lat = round(((double) (newLocation.getLatitude())),3,BigDecimal.ROUND_HALF_UP); lon = round(((double) (newLocation.getLongitude())),3,BigDecimal.ROUND_HALF_UP); latituteField = (TextView) findViewById(R.id.lat); longitudeField = (TextView) findViewById(R.id.lon); currentSpeedField = (TextView) findViewById(R.id.speed); kmphSpeedField = (TextView) findViewById(R.id.kmph); avgSpeedField = (TextView) findViewById(R.id.avgspeed); avgKmphField = (TextView) findViewById(R.id.avgkmph); latituteField.setText("Current Latitude: "+String.valueOf(lat)); longitudeField.setText("Current Longitude: "+String.valueOf(lon)); currentSpeedField.setText("Current Speed (m/s): "+String.valueOf(currentSpeed)); kmphSpeedField.setText("Cuttent Speed (kmph): "+String.valueOf(kmphSpeed)); avgSpeedField.setText("Average Speed (m/s): "+String.valueOf(avgSpeed)); avgKmphField.setText("Average Speed (kmph): "+String.valueOf(avgKmph)); } //not entirely sure what these do yet public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; // Register the listener with the Location Manager to receive location updates locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, locationListener); } //Method to round the doubles to a max of 3 decimal places public static double round(double unrounded, int precision, int roundingMode) { BigDecimal bd = new BigDecimal(unrounded); BigDecimal rounded = bd.setScale(precision, roundingMode); return rounded.doubleValue(); } @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } } </code></pre> <p>BOTH PROBLEMS SOLVED THANKS TO ANSWERS FROM <a href="https://stackoverflow.com/users/764165/marco-grassi">Marco Grassi</a> AND <a href="https://stackoverflow.com/users/491125/marcovena">Marcovena</a>.</p> <p>New Code:</p> <pre><code>package Hartford.gps; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.widget.TextView; public class GPSMain extends Activity { //text views to display latitude and longitude static TextView latituteField; static TextView longitudeField; static TextView currentSpeedField; static TextView kmphSpeedField; static TextView avgSpeedField; static TextView avgKmphField; static TextView topSpeedField; static TextView topKmphField; //objects to store positional information protected static double lat; protected static double lon; //objects to store values for current and average speed protected static double currentSpeed; protected static double kmphSpeed; protected static double avgSpeed; protected static double avgKmph; protected static double totalSpeed; protected static double totalKmph; protected static double topSpeed=0; protected static double topKmph=0; //counter that is incremented every time a new position is received, used to calculate average speed static int counter = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wL = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,"My Tag"); wL.acquire(); startService(new Intent(this, Calculations.class)); latituteField = (TextView) findViewById(R.id.lat); longitudeField = (TextView) findViewById(R.id.lon); currentSpeedField = (TextView) findViewById(R.id.speed); kmphSpeedField = (TextView) findViewById(R.id.kmph); avgSpeedField = (TextView) findViewById(R.id.avgspeed); avgKmphField = (TextView) findViewById(R.id.avgkmph); topSpeedField = (TextView) findViewById(R.id.topspeed); topKmphField = (TextView) findViewById(R.id.topkmph); } static void run(){ latituteField.setText("Current Latitude: "+String.valueOf(lat)); longitudeField.setText("Current Longitude: "+String.valueOf(lon)); currentSpeedField.setText("Current Speed (m/s): "+String.valueOf(currentSpeed)); kmphSpeedField.setText("Cuttent Speed (kmph): "+String.valueOf(kmphSpeed)); avgSpeedField.setText("Average Speed (m/s): "+String.valueOf(avgSpeed)); avgKmphField.setText("Average Speed (kmph): "+String.valueOf(avgKmph)); topSpeedField.setText("Top Speed (m/s): "+String.valueOf(topSpeed)); topKmphField.setText("Top Speed (kmph): "+String.valueOf(topKmph)); } } </code></pre> <p>and</p> <pre><code>package Hartford.gps; import java.math.BigDecimal; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class Calculations extends Service implements LocationListener { static LocationManager locationManager; LocationListener locationListener; private static final String TAG = "Calculations"; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); Log.d(TAG, "onCreate"); run(); } private void run(){ final Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setSpeedRequired(true); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); //Acquire a reference to the system Location Manager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); // Define a listener that responds to location updates locationListener = new LocationListener() { public void onLocationChanged(Location newLocation) { GPSMain.counter++; //current speed for the GPS device GPSMain.currentSpeed = round(newLocation.getSpeed(),3,BigDecimal.ROUND_HALF_UP); GPSMain.kmphSpeed = round((GPSMain.currentSpeed*3.6),3,BigDecimal.ROUND_HALF_UP); if (GPSMain.currentSpeed&gt;GPSMain.topSpeed) { GPSMain.topSpeed=GPSMain.currentSpeed; } if (GPSMain.kmphSpeed&gt;GPSMain.topKmph) { GPSMain.topKmph=GPSMain.kmphSpeed; } //all speeds added together GPSMain.totalSpeed = GPSMain.totalSpeed + GPSMain.currentSpeed; GPSMain.totalKmph = GPSMain.totalKmph + GPSMain.kmphSpeed; //calculates average speed GPSMain.avgSpeed = round(GPSMain.totalSpeed/GPSMain.counter,3,BigDecimal.ROUND_HALF_UP); GPSMain.avgKmph = round(GPSMain.totalKmph/GPSMain.counter,3,BigDecimal.ROUND_HALF_UP); //gets position GPSMain.lat = round(((double) (newLocation.getLatitude())),3,BigDecimal.ROUND_HALF_UP); GPSMain.lon = round(((double) (newLocation.getLongitude())),3,BigDecimal.ROUND_HALF_UP); GPSMain.run(); } //not entirely sure what these do yet public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; // Register the listener with the Location Manager to receive location updates locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, locationListener); } //Method to round the doubles to a max of 3 decimal places public static double round(double unrounded, int precision, int roundingMode) { BigDecimal bd = new BigDecimal(unrounded); BigDecimal rounded = bd.setScale(precision, roundingMode); return rounded.doubleValue(); } public void onLocationChanged(Location location) { // TODO Auto-generated method stub } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } } </code></pre> <p>UPDATE FOR shababhsiddique</p> <pre><code>import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class Calculations extends Service{ static LocationManager locationManager; static LocationListener locationListener; private static long timerTime = 1; private static float timerFloatValue = 1.0f; private Context context; private int counter = 0; @Override public IBinder onBind(Intent intent) {return null;} @Override public void onCreate() { context = this; update(); } protected void update(){ final Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setSpeedRequired(true); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); //Acquire a reference to the system Location Manager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); // Define a listener that responds to location updates locationListener = new LocationListener() { public void onLocationChanged(Location newLocation) { counter++; if(GPSMain.GPSHasStarted==0){ GPSMain.previousLocation = newLocation; //gets position GPSMain.lat = round(((double) (GPSMain.previousLocation.getLatitude())),3,BigDecimal.ROUND_HALF_UP); GPSMain.lon = round(((double) (GPSMain.previousLocation.getLongitude())),3,BigDecimal.ROUND_HALF_UP); GPSMain.startingLocation = GPSMain.previousLocation; GPSMain.routeLat.add(Double.toString(GPSMain.startingLocation.getLatitude())); GPSMain.routeLon.add(Double.toString(GPSMain.startingLocation.getLongitude())); GPSMain.startTime = System.currentTimeMillis(); GPSMain.GPSHasStarted++; Toast.makeText(context, "GPS Connection Established", Toast.LENGTH_LONG).show(); startService(new Intent(context, AccelerometerReader.class)); Toast.makeText(context, "Accelerometer Calculating", Toast.LENGTH_LONG).show(); Toast.makeText(context, "Have A Safe Trip!", Toast.LENGTH_LONG).show(); } //gets position GPSMain.lat = round(((double) (newLocation.getLatitude())),3,BigDecimal.ROUND_HALF_UP); GPSMain.lon = round(((double) (newLocation.getLongitude())),3,BigDecimal.ROUND_HALF_UP); if (newLocation.distanceTo(GPSMain.previousLocation)&gt;2.0f){ GPSMain.distanceBetweenPoints = GPSMain.distanceBetweenPoints + newLocation.distanceTo(GPSMain.previousLocation); } //current speed for the GPS device GPSMain.mpsSpeed = newLocation.getSpeed(); if (GPSMain.mpsSpeed&gt;GPSMain.topMps) {GPSMain.topMps=GPSMain.mpsSpeed;} //store location in order to calculate distance during next iteration. GPSMain.previousLocation = newLocation; if (counter % 20 == 0){ GPSMain.routeLat.add(Double.toString(GPSMain.previousLocation.getLatitude())); GPSMain.routeLon.add(Double.toString(GPSMain.previousLocation.getLongitude())); } } //not entirely sure what these do yet public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} }; // Register the listener with the Location Manager to receive location updates locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 20, locationListener); } //Method to round the doubles to a max of 3 decimal places public static double round(double unrounded, int precision, int roundingMode){ BigDecimal bd = new BigDecimal(unrounded); BigDecimal rounded = bd.setScale(precision, roundingMode); return rounded.doubleValue(); } //formats the time taken in milliseconds into hours minutes and seconds public static String getTimeTaken(long end, long start){ @SuppressWarnings("unused") String formattedTime = "", hourHour = "", hourMin = ":", minSec = ":"; long timeTaken = end-start, hour = 0, min = 0, sec = 0; timerTime = timeTaken; timeTaken = (end-start)/1000; if (timeTaken&gt;9 ){ hourHour = "0"; hourMin = ":0"; if (timeTaken&gt;=60){ if (timeTaken&gt;= 3200){ hour = timeTaken/3200; timeTaken = timeTaken%3200; if (hour&gt;9){ hourHour = ""; } } min = timeTaken/60; timeTaken = timeTaken%60; if (min &gt;9){ hourMin = ":"; } } sec = timeTaken; if(sec%60&lt;10){ minSec = ":0"; } return formattedTime = (hourHour+hour+hourMin+min+minSec+sec); } sec = timeTaken; minSec = ":0"; hourMin = ":0"; hourHour = "0"; return formattedTime = (hourHour+hour+hourMin+min+minSec+sec); } public static double averageSpeed(){ //calculates average speed if (timerTime==0){timerTime=1;} timerFloatValue = (float) timerTime; timerFloatValue = timerFloatValue/1000; return GPSMain.avgMps = GPSMain.distanceBetweenPoints/timerFloatValue; } //rounds the float values from the accelerometer static String roundTwoDecimalFloat(float a){ float b = a/9.8f; String formattedNum; NumberFormat nf = new DecimalFormat(); nf.setMaximumFractionDigits(2); nf.setMinimumFractionDigits(2); formattedNum = nf.format(b); return formattedNum; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload