java - How to get user's current location and plot it on the map using OverlayItem -


i working on application related plotting buses , bus stops on map. 1 task user's current location , stop updating when app pauses , continue updating when app resumes. also, location update occurs @ once every 10 seconds or change in position of @ least 25 meters. need plot user's current location on map.

here's code mapdisplayfragment. overlayitems added here (including overlayitem representing user's location), , seems need create new classes implement these functionality instead of writing code in class did. thinking of building 2 classes: mylocationlistener extends locationlistener , mylocationfragment extends fragment, don't know how started: more specifically, don't know relationship between these classes should build. idea?

import java.util.arraylist; import java.util.list;  import org.osmdroid.defaultresourceproxyimpl; import org.osmdroid.resourceproxy; import org.osmdroid.api.imapcontroller; import org.osmdroid.tileprovider.tilesource.tilesourcefactory; import org.osmdroid.util.geopoint; import org.osmdroid.views.mapview; import org.osmdroid.views.overlay.itemizediconoverlay; import org.osmdroid.views.overlay.itemizediconoverlay.onitemgesturelistener; import org.osmdroid.views.overlay.overlayitem;  import android.app.activity; import android.app.alertdialog; import android.app.progressdialog; import android.content.context; import android.content.res.resources; import android.location.criteria; import android.location.location; import android.location.locationmanager; import android.os.asynctask; import android.os.bundle; import android.support.v4.app.fragment; import android.util.log; import android.view.layoutinflater; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import ca.ubc.cpsc210.exception.translinkexception; import ca.ubc.cpsc210.nextbus.model.bus; import ca.ubc.cpsc210.nextbus.model.busstop; import ca.ubc.cpsc210.nextbus.translink.itranslinkservice; import ca.ubc.cpsc210.nextbus.translink.translinkservice; import ca.ubc.cpsc210.nextbus.util.latlon; import ca.ubc.cpsc210.nextbus.util.textoverlay;  /**  * fragment holding map in ui.  */ public class mapdisplayfragment extends fragment {      /**      * log tag logcat messages      */     private final static string log_tag = "mapdisplayfragment";      /**      * location of nelson & granville, downtown vancouver      */     private final static geopoint nelson_granville      = new geopoint(49.279285, -123.123007);      /**      * overlay bus markers.      */     private itemizediconoverlay<overlayitem> buslocnoverlay;      /**      * overlay bus stop location      */     private itemizediconoverlay<overlayitem> busstoplocationoverlay;      /**      * overlay legend      */     private textoverlay legendoverlay;       /**      * view shows map      */     private mapview mapview;      /**      * selected bus stop      */     private busstop selectedstop;      /**      * wraps translink web service      */     private itranslinkservice tlservice;      /**      * map controller zooming in/out, centering      */     private imapcontroller mapcontroller;      /**      * true if , if map should zoom fit displayed route.      */     private boolean zoomtofit;      /**      * bus selected user      */     private overlayitem selectedbus;      /**      * user's location icon.      */     private overlayitem userlocnicon;      /**      * overlay user current location.      */     private itemizediconoverlay<overlayitem> userlocnoverlay;      /**      * user's location.      */     private geopoint location;      /**      * set translink service      */     @override     public void oncreate(bundle savedinstancestate) {         super.onactivitycreated(savedinstancestate);         log.d(log_tag, "onactivitycreated");          sethasoptionsmenu(true);          tlservice = new translinkservice(getactivity());          log.d(log_tag, "stop number mapping: " + (selectedstop == null ? "not set" : selectedstop.getstopnum()));     }      /**      * set map view overlays buses , selected bus stop.      */     @override     public view oncreateview(layoutinflater inflater, viewgroup container,             bundle savedinstancestate) {         log.d(log_tag, "oncreateview");          if (mapview == null) {             mapview = new mapview(getactivity(), null);              mapview.settilesource(tilesourcefactory.mapnik);             mapview.setclickable(true);             mapview.setbuiltinzoomcontrols(true);              // set default view map (this seems important when             // gets overwritten plotbuses)             mapcontroller = mapview.getcontroller();             mapcontroller.setzoom(mapview.getmaxzoomlevel() - 4);             mapcontroller.setcenter(nelson_granville);               buslocnoverlay = createbuslocnoverlay();             busstoplocationoverlay = createbusstoplocnoverlay();             legendoverlay = createtextoverlay();             userlocnoverlay = createuserlocnoverlay();              // order matters: overlays added later displayed on top of             // overlays added earlier.             mapview.getoverlays().add(busstoplocationoverlay);             mapview.getoverlays().add(buslocnoverlay);             mapview.getoverlays().add(userlocnoverlay);             mapview.getoverlays().add(legendoverlay);           }          return mapview;     }       @override     public void oncreateoptionsmenu(menu menu, menuinflater inflater) {         super.oncreateoptionsmenu(menu, inflater);         inflater.inflate(r.menu.fragment_map_refresh, menu);     }      @override     public boolean onoptionsitemselected(menuitem item) {         if (item.getitemid() == r.id.map_refresh) {             update(false);             return true;         }          return super.onoptionsitemselected(item);     }      /**      * when view destroyed, remove map view parent can      * added again when view re-created.      */     @override     public void ondestroyview() {         log.d(log_tag, "ondestroyview");          ((viewgroup) mapview.getparent()).removeview(mapview);          super.ondestroyview();     }      @override     public void ondestroy() {         log.d(log_tag, "ondestroy");          super.ondestroy();     }      /**      * update bus locations.      */     @override     public void onresume() {         log.d(log_tag, "onresume");          update(true);          super.onresume();     }      /**      * set selected bus stop      * @param selectedstop  selected stop      */     public void setbusstop(busstop selectedstop) {         this.selectedstop = selectedstop;     }      /**      * update bus location info selected stop,      * zoomtofit status , repaint.      *       * @param zoomtofit  true if map must zoomed fit (when new bus stop has been selected)      */     void update(boolean zoomtofit) {         log.d(log_tag, "update - zoomtofit: " + zoomtofit);          this.zoomtofit = zoomtofit;          if(selectedstop != null) {             new getbusinfo().execute(selectedstop);             selectedbus = null;         }          mapview.invalidate();      }      /**      * create overlay bus markers.      */     private itemizediconoverlay<overlayitem> createbuslocnoverlay() {         resourceproxy rp = new defaultresourceproxyimpl(getactivity());          onitemgesturelistener<overlayitem> gesturelistener = new onitemgesturelistener<overlayitem>() {             /**              * display bus information in dialog box when user taps              * bus.              *               * @param index  index of item tapped              * @param oi overlayitem tapped              * @return true indicate tap event has been handled              */             @override             public boolean onitemsingletapup(int index, overlayitem oi) {                 alertdialog dlg = createsimpledialog(oi.gettitle(), oi.getsnippet());                 dlg.show();                 if(selectedbus != null){                     selectedbus.setmarker(getresources().getdrawable(r.drawable.bus));                 }                 selectedbus = oi;                 selectedbus.setmarker(getresources().getdrawable(r.drawable.selected_bus));                 mapview.postinvalidate();                 return true;             }              @override             public boolean onitemlongpress(int index, overlayitem oi) {                 // nothing                 return false;             }         };          return new itemizediconoverlay<overlayitem>(                 new arraylist<overlayitem>(),                  getresources().getdrawable(r.drawable.bus),                  gesturelistener, rp);     }        /**      * create overlay bus stop marker.      */     private itemizediconoverlay<overlayitem> createbusstoplocnoverlay() {         resourceproxy rp = new defaultresourceproxyimpl(getactivity());          onitemgesturelistener<overlayitem> gesturelistener = new onitemgesturelistener<overlayitem>() {             /**              * display bus stop description in dialog box when user taps              * stop.              *               * @param index  index of item tapped              * @param oi overlayitem tapped              * @return true indicate tap event has been handled              */             @override             public boolean onitemsingletapup(int index, overlayitem oi) {                 alertdialog dlg = createsimpledialog(oi.gettitle(), oi.getsnippet());                 dlg.show();                  return true;             }              @override             public boolean onitemlongpress(int index, overlayitem oi) {                 // nothing                 return false;             }         };          return new itemizediconoverlay<overlayitem>(                 new arraylist<overlayitem>(),                  getresources().getdrawable(r.drawable.stop),                  gesturelistener, rp);     }      private textoverlay createtextoverlay() {         resourceproxy rp = new defaultresourceproxyimpl(getactivity());         resources res = getresources();         string legend = res.getstring(r.string.legend);          return new textoverlay(rp, legend);     }      /**      * create overlay user location markers.      */     private itemizediconoverlay<overlayitem> createuserlocnoverlay() {         resourceproxy rp = new defaultresourceproxyimpl(getactivity());          onitemgesturelistener<overlayitem> gesturelistener = new onitemgesturelistener<overlayitem>() {             /**              * display user location.              *               * @param index  index of item tapped              * @param oi overlayitem tapped              * @return true indicate tap event has been handled              */             @override             public boolean onitemsingletapup(int index, overlayitem oi) {                 // don't anything.                 return false;             }              @override             public boolean onitemlongpress(int index, overlayitem oi) {                 // nothing                 return false;             }         };          return new itemizediconoverlay<overlayitem>(                 new arraylist<overlayitem>(),                  getresources().getdrawable(r.drawable.map_pin_blue),                  gesturelistener, rp);     }      /**      * plot bus stop      */     private void plotbusstop() {         latlon latlon = selectedstop.getlatlon();         geopoint point = new geopoint(latlon.getlatitude(),                 latlon.getlongitude());         overlayitem overlayitem = new overlayitem(integer.valueof(selectedstop.getstopnum()).tostring(),                  selectedstop.getlocationdesc(), point);         busstoplocationoverlay.removeallitems(); // make sure not adding         // bus stop more once         busstoplocationoverlay.additem(overlayitem);     }      /**      * plot buses onto bus location overlay      *       * @param zoomtofit  determines if map should zoomed bounds of plotted buses      */     private void plotbuses(boolean zoomtofit) {         list<bus> buses = selectedstop.getbuses();         double maxlatspan = 0.0;         double maxlonspan = 0.0;           buslocnoverlay.removeallitems();         for(bus b : buses){             double latdifference = math.abs(b.getlatlon().getlatitude()-nelson_granville.getlatitude() );             if(latdifference > maxlatspan && (latdifference < 2.0)){                 maxlatspan = latdifference;             }             double londifference = math.abs(b.getlatlon().getlongitude()-nelson_granville .getlongitude());             if(londifference > maxlonspan && (londifference < 2.0)){                 maxlonspan = londifference;             }             string routeno = b.getroute().getname();             string desc = b.getdescription();             latlon latlon = b.getlatlon();             geopoint point = new geopoint(latlon.getlatitude(), latlon.getlongitude());             overlayitem overlayitem = new overlayitem(routeno, desc, point);             buslocnoverlay.additem(overlayitem);         }          if(zoomtofit){             mapcontroller.zoomtospan((int)math.abs(maxlatspan*2e6), (int) math.abs(maxlonspan*2e6));         }       }       /**      * helper create simple alert dialog display message      * @param title  title displayed @ top of dialog      * @param msg  message display in dialog      * @return  alert dialog      */     private alertdialog createsimpledialog(string title, string msg) {         alertdialog.builder dialogbldr = new alertdialog.builder(getactivity());         dialogbldr.settitle(title);         dialogbldr.setmessage(msg);         dialogbldr.setneutralbutton(r.string.ok, null);          return dialogbldr.create();     }      public void getuserlocation() {         criteria criteria = new criteria();         context cont = new activity();           locationmanager locationmanager = (locationmanager) getactivity().getsystemservice(context.location_service);         string bestprovider = locationmanager.getbestprovider(criteria, true);          location userlocation = locationmanager.getlastknownlocation(bestprovider);          location = new geopoint(userlocation.getlatitude() * 1e6, userlocation.getlongitude() * 1e6);         }      private void plotuserlocation() {         getuserlocation();         userlocnicon = new overlayitem("userlocn", "user location", location);          userlocnoverlay.additem(userlocnicon);      }      /**       * asynchronous task bus location estimates translink service.      * displays progress dialog while running in background.        */     private class getbusinfo extends     asynctask<busstop, void, void> {         private progressdialog dialog = new progressdialog(getactivity());         private boolean success = true;          @override         protected void onpreexecute() {             dialog.setmessage("retrieving bus info...");             dialog.show();         }          @override         protected void doinbackground(busstop... selectedstops) {             busstop selectedstop = selectedstops[0];              try {                 tlservice.addbuslocationsforstop(selectedstop);             } catch (translinkexception e) {                 e.printstacktrace();                 success = false;             }              return null;         }          @override         protected void onpostexecute(void dummy) {             dialog.dismiss();              if (success) {                 plotbuses(zoomtofit);                 plotbusstop();                 plotuserlocation();                 mapview.invalidate();             } else {                 alertdialog dialog = createsimpledialog("error", "unable retrieve bus location info...");                 dialog.show();             }         }     } } 

any appreciated.

i had same problem after doing search on google know mapview deprecated now. must use map fragment , extend fragmentactivity instead of mapactivity


Comments

Popular posts from this blog

user interface - How to replace the Python logo in a Tkinter-based Python GUI app? -

objective c - Greedy NSProgressIndicator Allocation -

how to set an OCR language in Google Drive -