I'm making an android application which should be able to retrieve the user's correct location, and put it in a HashMap to show the route in a different layout.
Anyway my question is, why location manager does not change the google map location when my location changes, I can see that point changes to the right position, but the camera does not move away, so my location is shown in the center of the screen image, please tell me why?
The plan is to show the route I've gone on the mapso that I see one polyline from my old position for my new position, but first camera move onto my correct position
Here is my code:
public class RunningActivity extends FragmentActivity implements LocationListener{
// GoogleMap for the screen
private GoogleMap runningMap;
private LocationManager lm;
// stop watch
private Chronometer mChronometer;
private double longitude,latitude;
Location lastLocationloc=null;
// start & stop the time
private long startTime,elapsedTime;
// to be used in timer
private boolean runningIsOn = false;
private Thread timer;
Button start,stop;
//saving position in a map
Map<Integer, RouteObject> map = new HashMap<Integer, RouteObject>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(isGooglePlay()){
setContentView(R.layout.running);
setupMap();
}
// Connect the chronometer to show the user his stopwatch
mChronometer = (Chronometer) findViewById(R.id.chronometer_running);
// Watch for button clicks.
start = (Button)findViewById(R.id.startRunningBtn);
start.setOnClickListener(mStartListener);
stop = (Button)findViewById(R.id.stopRunningBtn);
stop.setOnClickListener(mStopListener);
runningMap.setMyLocationEnabled(true);
runningMap.setOnMapLongClickListener(myOnMapLongClickListener);
timer = new Thread(){
public void run(){
try{
int count = 1;
// While the user has not pressed the stop button
while(runningIsOn){
// Sleeps for 5 seconds
sleep(5000);
// Put the object in the map
RouteObject object = new RouteObject(count,((double)System.nanoTime() / 1000000000.0), longitude,latitude);
map.put(count,object);
// count the objects to give them a name.
count++;
}
}
catch(InterruptedException e){
e.printStackTrace();
}
// Write a test to the logcat
RouteObject.getMap(map);
}
};
}
OnMapLongClickListener myOnMapLongClickListener = new OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng point) {
runningMap.addMarker(new MarkerOptions().position(point).title(
point.toString()));
Location myLocation = runningMap.getMyLocation();
if (myLocation == null) {
Toast.makeText(getApplicationContext(),
"My location not available", Toast.LENGTH_LONG).show();
} else {
PolylineOptions polylineOptions = new PolylineOptions();
polylineOptions.add(point);
polylineOptions.add(new LatLng(myLocation.getLatitude(),
myLocation.getLongitude()));
runningMap.addPolyline(polylineOptions);
}
}
};
View.OnClickListener mStartListener = new OnClickListener() {
public void onClick(View v) {
// Starting the chronometer to be shown on user screen
mChronometer.setBase(SystemClock.elapsedRealtime());
mChronometer.start();
// Starting the real timing to be used in database
startTime = System.nanoTime();
// Setting value, to be used in thread
runningIsOn = true;
// Starting the Thread
timer.start();
stop.setBackgroundResource(R.drawable.stopon);
start.setBackgroundResource(R.drawable.recordpause);
}
};
View.OnClickListener mStopListener = new OnClickListener() {
public void onClick(View v) {
// thread should now be stopped
runningIsOn = false;
mChronometer.stop();
stop.setBackgroundResource(R.drawable.stopoff);
start.setBackgroundResource(R.drawable.recordon);
elapsedTime = System.nanoTime() - startTime;
// get the seconds
double seconds = (double)elapsedTime / 1000000000.0;
// Format the result with 4 decimals
DecimalFormat df = new DecimalFormat("0.0000");
// To the screen
System.out.println("Elapsed time: "+ df.format(seconds));
// To the database
System.out.println("Elapsed time: "+ seconds);
Toast.makeText(RunningActivity.this,df.format(seconds), Toast.LENGTH_LONG).show();
Gson gson = new Gson();
String list = gson.toJson(map);
Intent intent = new Intent(RunningActivity.this, RoutesActivity.class);
intent.putExtra("your_map", list);
startActivity(intent);
}
};
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.action_legalnotices){
startActivity(new Intent(this,LegalNoticesActivity.class));
}
return super.onOptionsItemSelected(item);
}
@Override
public void onLocationChanged(Location location) {
runningMap.setMapType(4);
if(lastLocationloc == null){
lastLocationloc = location;
}
LatLng lastLatLng= locationToLatLng(lastLocationloc);
LatLng thisLatLng= locationToLatLng(location);
PolylineOptions polylineOptions = new PolylineOptions();
polylineOptions.add(thisLatLng);
polylineOptions.add(lastLatLng);
runningMap.addPolyline(polylineOptions);
lastLocationloc = location;
LatLng latlng = new LatLng(location.getLatitude(),location.getLongitude());
CameraUpdate center=CameraUpdateFactory.newLatLng(latlng);
CameraUpdate zoom=CameraUpdateFactory.zoomTo(17);
runningMap.moveCamera(center);
runningMap.animateCamera(zoom);
String message = String.format("Your new location found at: \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude());
Toast.makeText(RunningActivity.this, message, Toast.LENGTH_LONG).show();
lm.removeUpdates(this);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
Toast.makeText(RunningActivity.this,"Provider disabled by the user. GPS turned off",Toast.LENGTH_LONG).show();
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Toast.makeText(RunningActivity.this,"Provider enabled by the user. GPS turned on",Toast.LENGTH_LONG).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Toast.makeText(RunningActivity.this,"Provider status changed",Toast.LENGTH_LONG).show();
}
private void setupMap() {
if (runningMap == null) {
runningMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.running_map)).getMap();
if (runningMap != null) {
runningMap.setMyLocationEnabled(true);
runningMap.animateCamera(CameraUpdateFactory.zoomBy(17));
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
String provider = lm.getBestProvider(new Criteria(), true);
if (provider == null) {
// ask the user to turn on his gps
onProviderDisabled(provider);
}
Location loc = lm.getLastKnownLocation(provider);
if (loc != null) {
onLocationChanged(loc);
}
}
}
}
private boolean isGooglePlay(){
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if(status == ConnectionResult.SUCCESS){
return(true);
}else{
//Google Play services own error mesage
//((Dialog)GooglePlayServicesUtil.getErrorDialog(status,this, 10)).show();
Toast.makeText(this,"Google Play is not available", Toast.LENGTH_SHORT).show();
}
return(false);
}
public static LatLng locationToLatLng(Location loc) {
if(loc != null)
return new LatLng(loc.getLatitude(), loc.getLongitude());
return null;
}
}