Harshid Vasoya
Harshid Vasoya

Reputation: 5721

getting latitude and longitude using gps every 10 minute in background android

I am done getting latitude and longitude using LocationManager and working proper.

Requirement:

get latitude and longitude every 10 minute if application is close or not.

I am try services,Thread,AlarmManager etc.

My application is work good for 1-2 hours then after automatically not get latitude and longitude but my services is still running.

If any one know then please give me guide line how to fetch latitude and longitude every 10 minute in background.

LocationActivity.java

when user click on start button.

Intent i=new Intent(context, OnAlarmReceiver.class);
    PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
         SystemClock.elapsedRealtime()+60000,PERIOD,pi);

OnAlarmReceiver.java

i am start my services.

public class OnAlarmReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
       context.startService(new Intent(context, MyService.class));
  }
}

MyService.java

@Override
    public void onStart(Intent intent, int startId) {
        // super.onStart(intent, startId);
        new MyTime(mContext);
    }

MyTime.java

getting latitude and longitude.

Upvotes: 5

Views: 4465

Answers (5)

ritesh4326
ritesh4326

Reputation: 627

Try By this one :

private void doSomethingRepeatedly() {
      timer.scheduleAtFixedRate( new TimerTask() {
            public void run() {

                  try{

            //Do your work here

                  }
                  catch (Exception e) {
                      // TODO: handle exception
                  }

             }
            }, 0, 10000);
                     }

Upvotes: 0

Harshid Vasoya
Harshid Vasoya

Reputation: 5721

I am using this way and solve my problem.

PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), PERIOD , pi);

I am don't know this is right or wrong.but work for me. Thanks @Lucifer,@Maya mAku and @piotrpo for your guidline.

Upvotes: 0

piotrpo
piotrpo

Reputation: 12636

I do not see any service finalization command, while you are trying to get position only on start command.

Generally speaking - it's quite complex problem: 10 minutes period suggests usage of AlarmManager - it's ok but... Getting position sometimes lasts much more than 10 minutes. GPS receiver consumes extraordinary amount of battery when it try to get position fix, so there is possibility, that in some conditions switching GPS on/off periodically will consume more battery than leaving it turned on. Consider some "loosy compression" - combine different location providers to call GPS only when really needed (i.e. time, coarse location changed etc.)

Upvotes: 0

Roadies
Roadies

Reputation: 3329

your location will really not be saved in the database because every time your location is updated(via onLocationChanged(Location location))

what you should do is bring your timerinitialization in your OnCreate() method. then declare these variables.

double lat = location.getLatitude();
double lng = location.getLongitude();
double alt = location.getAltitude();

as global and have them updated in the onLocationChanged(Location location)method. This way, whenever the timer calls on persistence in your database, the lat, lng, alt values will be available and be updated based on your latest location.

//decalred as global variables
String curTime;
double lat;
double lng;
double alt;

 public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);

    //Initialize timer
    Timer timer = new Timer();
        timer.schedule(new TimerTask(){
            @Override
            public void run(){
                db.execSQL("INSERT INTO location (longitude,latitude,altitude,tgl_buat) VALUES " +
                        "('"+lng+"','"+lat+"','"+alt+"','"+curTime+"')");
                db.close();
            }
        }, 10*60*1000, 10*60*1000);


updateWithNewLocation(null);

locationManager.requestLocationUpdates(provider, (10*60*1000), 10,
                                       locationListener);
   }
   private final LocationListener locationListener = new LocationListener() {
   public void onLocationChanged(Location location) {
   updateWithNewLocation(location);
}

public void onProviderDisabled(String provider){
  updateWithNewLocation(null);
}

public void onProviderEnabled(String provider){ }
public void onStatusChanged(String provider, int status, 
                            Bundle extras){ }
 };
 public void updateWithNewLocation(Location location) {


    if (location != null) {
        Dbhelper helper = new Dbhelper(this);
        final SQLiteDatabase db = helper.getWritableDatabase();
        long time = System.currentTimeMillis();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
        curTime = df.format(time);
        lat = location.getLatitude();
        lng = location.getLongitude();
        alt = location.getAltitude();
        System.out.println(lat);
        System.out.println(lng);
        System.out.println(alt);

    } 

  }

ADDED:- and if you draw a path then you use a This code

/** Called when the activity is first created. */
private List<Overlay> mapOverlays;

  private Projection projection;  

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

linearLayout = (LinearLayout) findViewById(R.id.zoomview);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);

mapOverlays = mapView.getOverlays();        
projection = mapView.getProjection();
mapOverlays.add(new MyOverlay());        

}

  @Override
  protected boolean isRouteDisplayed() {
  return false;
  }

 class MyOverlay extends Overlay{

  public MyOverlay(){

  }   

public void draw(Canvas canvas, MapView mapv, boolean shadow){
    super.draw(canvas, mapv, shadow);

    Paint   mPaint = new Paint();
    mPaint.setDither(true);
    mPaint.setColor(Color.RED);
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(2);

    GeoPoint gP1 = new GeoPoint(19240000,-99120000);
    GeoPoint gP2 = new GeoPoint(37423157, -122085008);

    Point p1 = new Point();
    Point p2 = new Point();
    Path path = new Path();

    projection.toPixels(gP1, p1);
    projection.toPixels(gP2, p2);

    path.moveTo(p2.x, p2.y);
    path.lineTo(p1.x,p1.y);

    canvas.drawPath(path, mPaint);
}

Upvotes: 1

Lucifer
Lucifer

Reputation: 29632

Try this way,

instead of this line

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
         SystemClock.elapsedRealtime()+60000,PERIOD,pi);

try my logic,

alarmManager.set(AlarmManager.RTC_WAKEUP, 60 * 1000, pi);

You can also see a very good example of AlarmManager.

Upvotes: 0

Related Questions