java - Why Does Map Marker Lurch Around The Map -
i'm in android studio , have map fragment (com.google.android.gms.maps.supportmapfragment) has 2 markers. 1 static , called target. other tracks movements , called hunter. works problem hunter marker lurches about. have update interval set @ 15 milliseconds, @ walking speed updates once every block.
so, how add marker track location , have reasonably accurate , update in real-time? or doing wrong here?
greg
oncreate()
setupmapifneeded(); if (mmap != null) { latlng target = new latlng(targetlat, targetlong); mmap.movecamera(cameraupdatefactory.newlatlngzoom(target, 15)); } locationmanager locationmanager = (locationmanager) this.getsystemservice(this.location_service); locationlistener locationlistener = new locationlistener() { public void onlocationchanged(location location) { makeuseofnewlocation(location); } public void onstatuschanged(string provider, int status, bundle extras) {} public void onproviderenabled(string provider) { registerforupdates(); } public void onproviderdisabled(string provider) { deregisterforupdates(); } }; locationmanager.requestlocationupdates(locationmanager.network_provider, 0, 0, locationlistener); private void registerforupdates() { _locationmanager.requestlocationupdates(locationmanager.gps_provider, gps_frequency_millis, 0, _locationlistener); }
update marker when location changes. when close target, vibrate , change text.
private void makeuseofnewlocation(location loc) { hunterlat = loc.getlatitude(); hunterlong = loc.getlongitude(); if (hunter != null) { latlng newloc = new latlng(hunterlat, hunterlong); hunter.setposition(newloc); textview txtitem = (textview) findviewbyid(r.id.itemname); if (hunterlong > targetlong - .0007 && hunterlong < targetlong + .0007 && hunterlat > targetlat - .0007 && hunterlat < targetlat + .0007) { txtitem.settextcolor(color.magenta); txtitem.settext(itemname); if (!vibrated){ vibrated = true; vibrator v = (vibrator) this.getsystemservice(context.vibrator_service); v.vibrate(500); } } else { txtitem.settextcolor(color.black); txtitem.settext(getresources().getstring(r.string.hunt_item)); } } else { hunter = mmap.addmarker(new markeroptions().position(new latlng(hunterlat, hunterlong)).title("you")); bitmapdescriptor icon2 = bitmapdescriptorfactory.fromresource(r.drawable.ic_map_person); hunter.seticon(icon2); } }
set map , add static target marker
private void setupmapifneeded() { // null check confirm have not instantiated map. if (mmap == null) { // try obtain map supportmapfragment. mmap = ((supportmapfragment) getsupportfragmentmanager().findfragmentbyid(r.id.map)) .getmap(); // check if successful in obtaining map. if (mmap != null) { setupmap(); } } } private void setupmap() { marker target = mmap.addmarker(new markeroptions().position(new latlng(targetlat, targetlong)).title(location)); bitmapdescriptor icon = bitmapdescriptorfactory.fromresource(r.drawable.ic_target); target.seticon(icon); }
after seeing other question, looks non-map activity getting onproviderenabled()
callback, map activity not getting (unless gps radio enabled during use of map activity).
instead of calling registerforupdates()
in onproviderenabled()
callback, call in oncreate()
if gps radio enabled, , fall-back network location if gps disabled , network location enabled.
something this:
locationmanager locationmanager = (locationmanager) this.getsystemservice(this.location_service); if (locationmanager.isproviderenabled(locationmanager.gps_provider)) { registerforupdates(); } else if (locationmanager.isproviderenabled(locationmanager.network_provider)) { locationmanager.requestlocationupdates(locationmanager.network_provider, 0, 0, locationlistener); }
another thing note should unregister location callbacks in onpause()
override activities request location updates, don't have unnecessary battery drain caused app.
Comments
Post a Comment