Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to periodically find gps location in Android

Tags:

android

gps

I am writing an app that records a new gps location every ten minutes on the dot.

I've tried location pollers, putting the location listener in a service, and putting the location listener in an activity but none of these methods work for me.

I need a method to turn on the gps location listener 2 minutes before I begin recording my location data (to give the gps ample time to find a location or determine there is no signal). I've been doing this by using an alarm that calls my gpsActivity 2 minutes before I call my updatelocation class. My updatelocation class then takes the gpsActivity's locationmanager and extracts a location from it.

In theory this should work but when I put it on my phone I always get bad data (accuracy is too low or no signal at all)

If someone could help me out I would be extremely grateful.

Thanks

Alarm calls this class 2 mins before update location

public class GPSActivity extends Activity {

    public static LocationListener loc_listener = null;
    public static LocationManager locationManager = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        getGPS();
    }

    public static void getGPS() {
        if (loc_listener == null) {
            loc_listener = new LocationListener() {

                @Override
                public void onStatusChanged(String provider, int status,
                        Bundle extras) {}

                @Override
                public void onProviderEnabled(String provider) {}

                @Override
                public void onProviderDisabled(String provider) {}

                @Override
                public void onLocationChanged(Location location) {}
            };
        }
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, 0, 0, loc_listener);
    }

    public static void killGPS() {
        if (locationManager != null && loc_listener != null) {
            locationManager.removeUpdates(loc_listener);
        }
    }
}

then two mins later this service is called

public class UpdateLocation extends IntentService {

    public static final String id = "";
    public static int retryCount = 0;
    int notificationID = 1;
    // gets the location manager from the GPSActivity
    LocationManager locationManager = GPSActivity.locationManager;

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public UpdateLocation() {
        super("UpdateLocation");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        locationManager = GPSActivity.locationManager;
        SharedPreferences prefs = getSharedPreferences("Settings", 0);
        final String id = prefs.getString("ID", "");
        HttpParams httpParams = new BasicHttpParams();
        // 30seconds and it stops
        HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
        HttpConnectionParams.setSoTimeout(httpParams, 30000);
        DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
        HttpPost httpost = new HttpPost(
                "http://iphone-radar.com/gps/gps_locations");
        JSONObject holder = new JSONObject();
        try {
            holder.put("id", id);
            Location location = getLocation();
            if (location != null && (location.getAccuracy() < 25)) {
                retryCount = 0;
                Calendar c = Calendar.getInstance();
                SimpleDateFormat sdf = new SimpleDateFormat(
                        "hh:mmaa MM/dd/yyyy");
                holder.put("time", sdf.format(c.getTime()));
                holder.put("time_since_epoch",
                        System.currentTimeMillis() / 1000);
                holder.put("lat", location.getLatitude());
                holder.put("lon", location.getLongitude());
                StringEntity se = new StringEntity(holder.toString());
                httpost.setEntity(se);
                httpost.setHeader("Accept", "application/json");
                httpost.setHeader("Content-type", "application/json");
                ResponseHandler responseHandler = new BasicResponseHandler();
                String response = httpclient.execute(httpost,
                        responseHandler);
                org.json.JSONObject obj;
                obj = new org.json.JSONObject(response);
                SimpleDateFormat sdf2 = new SimpleDateFormat(
                        "yyyy-MM-dd hh:mm:ssaa");
                addHistory(
                        sdf2.format(c.getTime()),
                        "Background GPS",
                        "Latitude: "
                            + String.format("%.6g%n",
                                    location.getLatitude())
                            + "\n"
                            + "Longitude: "
                            + String.format("%.6g%n",
                                    location.getLongitude()));
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString("LastUpdatedTime", sdf.format(c.getTime()));
                editor.commit();
                Intent setAlarm = new Intent(UpdateLocation.this,
                        UpdateLocation.class);
                PendingIntent pendingIntent = PendingIntent.getService(
                        UpdateLocation.this, 0, setAlarm, 0);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(System.currentTimeMillis());
                int UPDATE_TIME = prefs.getInt("Update_time", 10);
                calendar.add(Calendar.MINUTE, UPDATE_TIME);
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), pendingIntent);
                // sets an alarm for the next time we need to record a
                // location
                GPSActivity.killGPS();
                // turns off the gps location listener
                Intent setAlarm2 = new Intent(UpdateLocation.this,
                        GPSActivity.class);
                PendingIntent pendingIntent2 = PendingIntent.getService(
                        UpdateLocation.this, 0, setAlarm2, 0);
                Calendar calendar2 = Calendar.getInstance();
                calendar2.add(Calendar.MINUTE, UPDATE_TIME - 2);
                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        calendar2.getTimeInMillis(), pendingIntent2);
                // sets an alarm to turn on the gpsActivity 2mins before the
                // next time updatelocation needs to record some data
            }
        } finally {
        }
    }
}
like image 634
Sean Avatar asked Oct 12 '11 12:10

Sean


People also ask

How do I turn on location services automatically?

Open your phone's Settings app. Under "Personal," tap Location access. At the top of the screen, turn Access to my location on or off.

Can I track my phone's location history?

If you have an Android phone and the Find My Device app, you can log in to your Google account and use Google Maps to check your phone's location history.


1 Answers

Use receiver and service together. For this purpose you can find a complete sample in this link. There is a listener in it. Listener can be used in your activity to be noticed that a new location is ready for you.

like image 54
Bobs Avatar answered Sep 24 '22 07:09

Bobs