androidgpslocation

automatically update location without restart the application


i am building a simple android application which require me to auto update the location. the auto update location will not only update when resuming the application but must auto update whenever the application is on. this application looks like the same with GPS system that were put inside the car. it get the exact location and always update the current location. i want to the same thing in here. i am building this application on android 2.2.

here is my code:

 package com.example.map;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.widget.TextView;
import android.widget.Toast;

public class MapActivity extends Activity implements LocationListener{
    private TextView latituteField, longitudeField, accuracyField, altitudeField, bearingField; 
    private LocationManager locationManager;
    private String provider;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

    latituteField = (TextView) findViewById(R.id.TextView02);
    longitudeField = (TextView) findViewById(R.id.TextView04);
    accuracyField = (TextView) findViewById(R.id.textView1);
    altitudeField = (TextView) findViewById(R.id.textView2);
    bearingField = (TextView) findViewById(R.id.textView4);

    // Get the location manager
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the locatioin provider -> use default  
    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);


    // Initialize the location fields
    if (location != null) {
      System.out.println("Provider " + provider + " has been selected.");
      onLocationChanged(location);
    } else {
      latituteField.setText("Location not available");
      longitudeField.setText("Location not available");
    }
  }

  /* Request updates at startup */
  @Override
  protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 400, 1, this);
  }

  /* Remove the locationlistener updates when Activity is paused */
  @Override
  protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
  }

  @Override
  public void onLocationChanged(Location location) {
    int lat = (int) (location.getLatitude());
    int lng = (int) (location.getLongitude());
    int acc = (int) (location.getAccuracy());
    int alt = (int) (location.getAltitude());
    int bearing = (int) (location.getBearing());
    latituteField.setText(String.valueOf(lat));
    longitudeField.setText(String.valueOf(lng));
    accuracyField.setText(String.valueOf(acc));
    altitudeField.setText(String.valueOf(alt));
    bearingField.setText(String.valueOf(bearing));

  }

  @Override
  public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

  }

  @Override
  public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
        Toast.LENGTH_SHORT).show();

  }

  @Override
  public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
        Toast.LENGTH_SHORT).show();
  }

this code it only update the location value when im resuming the application (i quit the application then go back to the application). the location will be updated at the viewtext.

i also tried to do while. like this.

if(location != null){
    do{
        System.out.println("Provider " + provider + " has been selected.");
        onLocationChanged(location);
        locationManager.requestLocationUpdates(provider, 0, 0, this);
    }while(location != null);
    }
    else{
        latituteField.setText("Location not available");
        longitudeField.setText("Location not available");
    }

im adding this to the manifest.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.INTERNET" /> 

however, this code makes the application crash in a real phone. is there anyway to get this done?

*note: i tested all this application in my real phone and trying to achieve the current location. the textview suppose to change whenever it gets the new value of the location without pausing or quitting the application.


Solution

  • You have to put your location code inside an ScheduledExecutor Service:

    http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html

    That one repeats actualization function in the background for example every 30 seconds or whatever time you specify.

    Example:

        scheduleTaskExecutor= Executors.newScheduledThreadPool(5);
    
        // This schedule a task to run every 10 seconds:
    
        scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
          public void run() {
    
    
                try {                 
    
    
                    //add your code you would like to be executed every 10 seconds.
    
    
    
                } catch (IOException e) {                          
                   e.printStackTrace();                           
                }                                     
    
    
          }
        }, 0, 10, TimeUnit.SECONDS);
    

    you also might have to add a permission for coarse location.