java - How can I use AlarmReceiver to ping GPS location every 10 minutes? -


i'm sorry ahead of time, question pretty lengthy.

i have functioning gpstracker class contains means of pinging gps location device. in mainactivity, have button uses gps tracker display location in toast. i'm trying convert button automatic action repeated every x minutes, let's go 10.(right alarm receiver setup 10 seconds) when app in background. set alarmreceiver try this, can't quite working.

here's gpstracker class:

    import android.app.alertdialog;     import android.app.service;     import android.content.context;     import android.content.dialoginterface;     import android.content.intent;     import android.location.location;     import android.location.locationlistener;     import android.location.locationmanager;     import android.os.bundle;     import android.os.ibinder;     import android.provider.settings;  public class gpstracker extends service implements locationlistener { private final context context;  boolean isgpsenabled = false; boolean cangetlocation = false; boolean isnetworkenabled = false;  location location;  double latitude; double longitude;  private static final long min_distance_change_for_updates = 10; private static final long min_time_bw_updates = 1000 * 60 * 1;  protected locationmanager locationmanager;  public gpstracker(context context) {     this.context = context.getapplicationcontext();     getlocation(); }  public location getlocation(){     try {         locationmanager = (locationmanager) context.getsystemservice(location_service);          isgpsenabled = locationmanager.isproviderenabled(locationmanager.gps_provider);          isnetworkenabled = locationmanager.isproviderenabled(locationmanager.network_provider);          if(!isgpsenabled && !isnetworkenabled) {          }else {             this.cangetlocation = true;              if (isnetworkenabled) {                 locationmanager.requestlocationupdates(                         locationmanager.network_provider,                         min_time_bw_updates,                         min_distance_change_for_updates, this);                   if(locationmanager != null){                     location = locationmanager.getlastknownlocation(locationmanager.network_provider);                      if(location !=null){                         latitude = location.getlatitude();                         longitude = location.getlongitude();                     }                 }             }              if(isgpsenabled){                 if(location == null){                     locationmanager.requestlocationupdates(locationmanager.gps_provider, min_time_bw_updates, min_distance_change_for_updates, this);                      if(locationmanager !=null){                         location = locationmanager.getlastknownlocation(locationmanager.gps_provider);                          if (location != null){                             latitude = location.getlatitude();                             longitude = location.getlongitude();                         }                     }                 }             }         }     } catch (exception e) {         e.printstacktrace();     }          return location; }  public void stopusinggps() {     if(locationmanager != null){         locationmanager.removeupdates(gpstracker.this);     } }  public double getlatitude() {     if(location!= null){         latitude = location.getlatitude();     }     return latitude; }  public double getlongitude() {     if(location !=null){         longitude = location.getlongitude();     }     return longitude; }  public boolean cangetlocation(){     return this.cangetlocation; }  public void showsettingsalert() {     alertdialog.builder alertdialog = new alertdialog.builder(context);      alertdialog.settitle("gps settings");      alertdialog.setmessage("gps isn't enabled.  want go settings menu?");      alertdialog.setpositivebutton("settings", new dialoginterface.onclicklistener() {          @override         public void onclick(dialoginterface dialoginterface, int i) {             intent intent = new intent(settings.action_location_source_settings);             context.startactivity(intent);         }     });      alertdialog.setnegativebutton("cancel", new dialoginterface.onclicklistener() {          @override         public void onclick(dialoginterface dialog, int i) {             dialog.cancel();         }     });      alertdialog.show(); }  @override public void onlocationchanged(location location) {  }  @override public void onstatuschanged(string s, int i, bundle bundle) {  }  @override public void onproviderenabled(string s) {  }  @override public void onproviderdisabled(string s) {  }  @override public ibinder onbind(intent intent) {     return null; }     } 

and here's mainactivity:

    package com.example.gwyn.locationnabtest;      import android.app.alarmmanager;     import android.app.pendingintent;     import android.content.broadcastreceiver;     import android.content.context; import android.content.intent; import android.support.v4.app.fragmentactivity; import android.support.v4.app.fragmentmanager; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.button; import android.widget.toast;  import com.google.android.gms.maps.googlemap; import com.google.android.gms.maps.mapfragment; import com.google.android.gms.maps.supportmapfragment; import com.google.android.gms.maps.model.latlng; import com.google.android.gms.maps.model.markeroptions;   public class mainactivity extends actionbaractivity {      button btnshowlocation;     button btnstartservice;     button btnstopservice;     gpstracker gps;     //googlemap mmap;      private pendingintent pendingintent;     private alarmmanager manager;        @override     protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_main);          btnshowlocation = (button) findviewbyid(r.id.show_location);          btnshowlocation.setonclicklistener(new view.onclicklistener(){              @override             public void onclick(view view) {                 fragmentactivity activity = (fragmentactivity)view.getcontext();                 fragmentmanager manager = activity.getsupportfragmentmanager();                 //mapfragment mymap = (mapfragment) (mainactivity.getfragmentmanager()).findfragmentbyid((r.id.mapfragment));                  // test, remove me.                // mmap = ((supportmapfragment) getsupportfragmentmanager().findfragmentbyid(r.id.mapfragment)).getmap();                  gps = new gpstracker(mainactivity.this);                  if(gps.cangetlocation()) {                     // location achieved.                     double latitude = gps.getlatitude();                     double longitude = gps.getlongitude();                      // draw marker current location on fragment                     // crashing app                    //  mmap.addmarker(new markeroptions().position(new latlng(latitude, longitude)).title("marker"));                      // toast popup of location data.                     toast.maketext(getapplicationcontext(), "your location -\nlat:" + latitude + "\nlong:" + longitude, toast.length_long).show();                 } else {                     gps.showsettingsalert();                 }             }         });          intent alarmintent = new intent(this, alarmreceiver.class);         pendingintent = pendingintent.getbroadcast(this, 0, alarmintent, 0);              btnstartservice = (button) findviewbyid(r.id.start_service);         btnstartservice.setonclicklistener(new view.onclicklistener() {             @override             public void onclick(view v) {                 manager = (alarmmanager)getsystemservice(context.alarm_service);                 int interval = 10000;                 // 10 second interval.  testing, turn off.                 manager.setrepeating(alarmmanager.rtc_wakeup, system.currenttimemillis(), interval, pendingintent);                 toast.maketext(getapplicationcontext(), "service started", toast.length_short).show();                  //startservice(new intent(getbasecontext(), myservices.class));             }                         });          btnstopservice = (button) findviewbyid(r.id.stop_service);         btnstopservice.setonclicklistener(new view.onclicklistener() {             @override             public void onclick(view v) {                 // cancel pending intents                 manager.cancel(pendingintent);                 toast.maketext(getapplicationcontext(), "pending intents cancelled", toast.length_short).show();             }         });         }      } 

to highlight specifically, part in mainactivity works display gps:

public void onclick(view view) {                 fragmentactivity activity = (fragmentactivity)view.getcontext();                 fragmentmanager manager = activity.getsupportfragmentmanager();                 //mapfragment mymap = (mapfragment) (mainactivity.getfragmentmanager()).findfragmentbyid((r.id.mapfragment));                  // test, remove me.                // mmap = ((supportmapfragment) getsupportfragmentmanager().findfragmentbyid(r.id.mapfragment)).getmap();                  gps = new gpstracker(mainactivity.this);                  if(gps.cangetlocation()) {                     // location achieved.                     double latitude = gps.getlatitude();                     double longitude = gps.getlongitude();                      // draw marker current location on fragment                     // crashing app                    //  mmap.addmarker(new markeroptions().position(new latlng(latitude, longitude)).title("marker"));                      // toast popup of location data.                     toast.maketext(getapplicationcontext(), "your location -\nlat:" + latitude + "\nlong:" + longitude, toast.length_long).show();                 } else {                     gps.showsettingsalert();                 }             } 

my alarmreceiver follows, , produces error when creating gpstracker:

import android.content.broadcastreceiver; import android.content.context; import android.content.intent; import android.widget.toast;   public class alarmreceiver extends broadcastreceiver {     gpstracker gps;      @override     public void onreceive(context arg0, intent arg1) {        // here's we'd grab location , store db.          //gps = new gpstracker(alarmreceiver.this);         // if(gps.cangetlocation()) {        //     double latitude = gps.getlatitude();        //     double longitude = gps.getlongitude();             // draw marker current location on fragment              // toast popup of location data.        //     toast.maketext(arg0, "your location -\nlat:" + latitude + "\nlong:" + longitude, toast.length_long).show();        // } else {         //    gps.showsettingsalert();        // }           // toast alarm ran.         toast.maketext(arg0, "location pinged.", toast.length_short).show();      } 

more specifically, part of problem way i'm calling new gps tracker object here:

//gps = new gpstracker(alarmreceiver.this); 

i'm not sure how achieve original result while using alarmreceiver instead of button, main source of problem. know can tinker here alarm receiver use gpstracker class?

do not use gpstracker. broken in on dozen ways. forget exists. if want better version, can use http://gabesechansoftware.com/location-tracking/ link explains why gpstracker broken design , why should never used. kinda works if used in optimal circumstances, , gives horrible data in others.

secondly, if you're using gps , not network- need give time location sync. can take seconds minutes (or hours, if user in basement or something) immediate forms of getting location won't work- have wait sync location.

i suggest not libraries solve , try understand how base apis work. until do, you're going have troubles use there's lots of corner cases here , not trivial thing do.


Comments

Popular posts from this blog

java - Spring Data JPA: Why findOne(id) executing delete query internally? -

python - Mongodb How to add addtional information when aggregating? -

java - Incorrect order of records in M-M relationship in hibernate -