android - Cuurent location marker appears multiple times on map . what I have to do? -


below in code have print current location movement updates , have print 2 locations along current location. current location marker getting appeared repeatedly on map. please me. code -

package com.example.swap.gps;  import android.manifest; import android.content.pm.packagemanager; import android.graphics.color; import android.location.location; import android.os.build; import android.os.bundle; import android.support.annotation.nonnull; import android.support.v4.app.activitycompat; import android.support.v4.app.fragmentactivity; import android.support.v4.content.contextcompat; import android.widget.toast;  import com.google.android.gms.common.connectionresult; import com.google.android.gms.common.googleplayservicesutil; import com.google.android.gms.common.api.googleapiclient; import com.google.android.gms.location.locationlistener; import com.google.android.gms.location.locationrequest; import com.google.android.gms.location.locationservices; import com.google.android.gms.maps.cameraupdatefactory; import com.google.android.gms.maps.googlemap; import com.google.android.gms.maps.onmapreadycallback; import com.google.android.gms.maps.supportmapfragment; import com.google.android.gms.maps.model.bitmapdescriptorfactory; import com.google.android.gms.maps.model.cameraposition; import com.google.android.gms.maps.model.circleoptions; import com.google.android.gms.maps.model.latlng; import com.google.android.gms.maps.model.marker; import com.google.android.gms.maps.model.markeroptions;  public class mapsactivity extends fragmentactivity implements onmapreadycallback,         locationlistener,         googleapiclient.connectioncallbacks,         googleapiclient.onconnectionfailedlistener{  private googlemap mmap; googleapiclient mgoogleapiclient;  locationrequest mlocationrequest;   @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);      //show error dialog if goolgleplayservices not available     if (!isgoogleplayservicesavailable()) {         finish();     }      setcontentview(r.layout.activity_maps);      if (android.os.build.version.sdk_int >= build.version_codes.m) {         checklocationpermission();     }     // obtain supportmapfragment , notified when map ready used.     supportmapfragment mapfragment = (supportmapfragment) getsupportfragmentmanager()             .findfragmentbyid(r.id.map);     mapfragment.getmapasync(this); }   public static final int my_permissions_request_location = 99;  public boolean checklocationpermission(){     if (contextcompat.checkselfpermission(this,             manifest.permission.access_fine_location)             != packagemanager.permission_granted) {          // asking user if explanation needed         if (activitycompat.shouldshowrequestpermissionrationale(this,                 manifest.permission.access_fine_location)) {              // show explanation user *asynchronously* -- don't block             // thread waiting user's response! after user             // sees explanation, try again request permission.              //prompt user once explanation has been shown             activitycompat.requestpermissions(this,                     new string[]{manifest.permission.access_fine_location},                     my_permissions_request_location);           } else {             // no explanation needed, can request permission.             activitycompat.requestpermissions(this,                     new string[]{manifest.permission.access_fine_location},                     my_permissions_request_location);         }         return false;     } else {         return true;     } }   /**  * manipulates map once available.  * callback triggered when map ready used.  * can add markers or lines, add listeners or move camera. in case,  * add marker near sydney, australia.  * if google play services not installed on device, user prompted install  * inside supportmapfragment. method triggered once user has  * installed google play services , returned app.  */ @override public void onmapready(googlemap googlemap) {     mmap = googlemap;     mmap.setmaptype(googlemap.map_type_normal);      //initialize google play services     if (android.os.build.version.sdk_int >= build.version_codes.m) {         if (contextcompat.checkselfpermission(this,                 manifest.permission.access_fine_location)                 == packagemanager.permission_granted) {             buildgoogleapiclient();             mmap.setmylocationenabled(true);         }     }     else {         buildgoogleapiclient();         mmap.setmylocationenabled(true);     }      latlng sahidkhudiram = new latlng(22.466 , 88.3918);     showmap(sahidkhudiram,"sahidkhudiram metro");      latlng kavinazrul = new latlng(22.4641823 , 88.38060670000004);     showmap(kavinazrul,"kavinazrul metro"); }  protected synchronized void buildgoogleapiclient() {     mgoogleapiclient = new googleapiclient.builder(this)             .addconnectioncallbacks(this)             .addonconnectionfailedlistener(this)             .addapi(locationservices.api)             .build();     mgoogleapiclient.connect(); }  private void showmap(latlng latlng, string place){     cameraposition cameraposition = new cameraposition.builder().target(             latlng).zoom(14).tilt(60).bearing(30).build();     /*if(marker!=null){         marker.remove();     }*/     marker marker = mmap.addmarker(new markeroptions().position(latlng).title(place));     marker.showinfowindow();     mmap.animatecamera(cameraupdatefactory.newcameraposition(cameraposition));     mmap.addcircle(new circleoptions().center(latlng).             radius(90).             strokewidth(3).             strokecolor(color.red).             fillcolor(color.transparent));  }  @override public void onlocationchanged(location location) {      toast.maketext(this,"new location found",toast.length_short).show();    //   mlastlocation = location;      //place current location marker     latlng latlng = new latlng(location.getlatitude(), location.getlongitude());      showmap(latlng,"me");   }  private boolean isgoogleplayservicesavailable() {     int status = googleplayservicesutil.isgoogleplayservicesavailable(this);     if (connectionresult.success == status) {         return true;     } else {         googleplayservicesutil.geterrordialog(status, this, 0).show();         return false;     } }  @override public void onconnected(bundle bundle) {      mlocationrequest = new locationrequest();     mlocationrequest.setinterval(1000);     mlocationrequest.setfastestinterval(1000);     mlocationrequest.setpriority(locationrequest.priority_balanced_power_accuracy);     if (contextcompat.checkselfpermission(this,             manifest.permission.access_fine_location)             == packagemanager.permission_granted) {         locationservices.fusedlocationapi.requestlocationupdates(mgoogleapiclient, mlocationrequest, this);     }  }  @override public void onconnectionsuspended(int i) {  }  @override public void onconnectionfailed(connectionresult connectionresult) {  }  @override public void onrequestpermissionsresult(int requestcode, @nonnull string[] permissions, @nonnull int[] grantresults) {     switch (requestcode) {         case my_permissions_request_location: {             // if request cancelled, result arrays empty.             if (grantresults.length > 0                     && grantresults[0] == packagemanager.permission_granted) {                  // permission granted.                 // contacts-related task need do.                 if (contextcompat.checkselfpermission(this,                         manifest.permission.access_fine_location)                         == packagemanager.permission_granted) {                      if (mgoogleapiclient == null) {                         buildgoogleapiclient();                     }                     mmap.setmylocationenabled(true);                 }              } else {                  // permission denied, disable functionality depends on permission.                 toast.maketext(this, "permission denied", toast.length_long).show();             }             return;         }          // other 'case' lines check other permissions app might request.         // can add here other case statements according requirement.     } } 

}

you doing wrong, creating new marker in onlocationchanged(). need create marker once when location first time onlocationchaned() need set new position marker. this

private marker yourlocationmarker; 

create 2 methods

private void addcurrentlocationmarkermarker(latlng latlng){ yourlocationmarker = mmap.addmarker(new markeroptions().position(latlng).title(place)); yourlocationmarker.showinfowindow(); mmap.animatecamera(cameraupdatefactory.newcameraposition(cameraposition)); mmap.addcircle(new circleoptions().center(latlng).         radius(90).         strokewidth(3).         strokecolor(color.red).         fillcolor(color.transparent)); }  public location getlocation() {     try {         locationmanager = (locationmanager) mcontext                 .getsystemservice(context.location_service);          // getting gps status         isgpsenabled = locationmanager                 .isproviderenabled(locationmanager.gps_provider);          log.v("isgpsenabled", "=" + isgpsenabled);          // getting network status         isnetworkenabled = locationmanager                 .isproviderenabled(locationmanager.network_provider);          log.v("isnetworkenabled", "=" + isnetworkenabled);          if (isgpsenabled == false && isnetworkenabled == false) {             // no network provider enabled         } else {             this.cangetlocation = true;             if (isnetworkenabled) {                 location=null;                 locationmanager.requestlocationupdates(                         locationmanager.network_provider,                         min_time_bw_updates,                         min_distance_change_for_updates, this);                 log.d("network", "network");                 if (locationmanager != null) {                     location = locationmanager                             .getlastknownlocation(locationmanager.network_provider);                     if (location != null) {                         latitude = location.getlatitude();                         longitude = location.getlongitude();                     }                 }             }             // if gps enabled lat/long using gps services             if (isgpsenabled) {                 location=null;                 if (location == null) {                     locationmanager.requestlocationupdates(                             locationmanager.gps_provider,                             min_time_bw_updates,                             min_distance_change_for_updates, this);                     log.d("gps enabled", "gps enabled");                     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; } 

in onmapready method

location location = getlocation(); addcurrentlocationmarkermarker(new latlng(location.getlatitude(), location.getlongitude())); 

in onlocationchanged method remove showmap , this

yourlocationmarker.setposition(new latlng(location.getlatitude(), location.getlongitude())); 

i hope helps. see this question


Comments

Popular posts from this blog

sql server - Cannot query correctly (MSSQL - PHP - JSON) -

php - trouble displaying mysqli database results in correct order -

C++ Linked List -