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;
}
}
The solution is here, the activity now writes a line from your last location to your new location, when the startbutton is pushed. Here is the code. The code makes a polyline every 5 second. I will hope some of you can use it, if your are making a Google Map Application.
public class RunningActivity extends FragmentActivity implements LocationListener, OnMyLocationChangeListener {
private GoogleMap map;
private LocationManager locationManager;
private static final long MIN_TIME = 5000;
private static final float MIN_DISTANCE = 5;
// 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> hashmap = new HashMap<Integer, RouteObject>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.running);
map = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.running_map)).getMap();
map.setMapType(4);
map.setMyLocationEnabled(true);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String provider = locationManager.getBestProvider(new Criteria(), true);
locationManager.requestLocationUpdates(provider, MIN_TIME,
MIN_DISTANCE, this);
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);
hashmap.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(hashmap);
}
};
// 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);
map.setOnMyLocationChangeListener(this);
}
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();
}
};
@Override
public void onMyLocationChange(Location lastKnownLocation) {
changeMapLocation(lastKnownLocation);
}
private void changeMapLocation(Location location) {
if (lastLocationloc == null) {
lastLocationloc = location;
}
LatLng lastLatLng = new LatLng(lastLocationloc.getLatitude(),lastLocationloc.getLongitude());
LatLng thisLatLng = new LatLng(location.getLatitude(),location.getLongitude());
// set variables for the hashmap
longitude = location.getLongitude();
latitude = location.getLatitude();
if(runningIsOn) {
map.addPolyline(new PolylineOptions()
.add(thisLatLng,lastLatLng)
.width(2)
.color(Color.RED));
}
map.animateCamera(CameraUpdateFactory.newLatLngZoom(thisLatLng, 18),null);
String old_message = String.format("My Old location: \n Longitude: %1$s \n Latitude: %2$s",lastLocationloc.getLongitude(),lastLocationloc.getLatitude());
Toast.makeText(RunningActivity.this, old_message,Toast.LENGTH_LONG).show();
String message = String.format("My new location: \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(),location.getLatitude());
Toast.makeText(RunningActivity.this, message,Toast.LENGTH_LONG).show();
lastLocationloc = location;
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.