我正在创建一个能够检索用户正确位置的android应用程序,并将其放在HashMap中以不同的布局显示路径。
无论如何,我的问题是,为什么位置管理员在我的位置更改时不会更改谷歌地图位置,我可以看到该点更改到正确的位置,但相机不会移开,所以我的位置显示在中心屏幕图片,请告诉我为什么?
计划是显示我在地图上走的路线,我从旧位置看到一条折线为我的新位置,但第一台相机移动到我的正确位置
这是我的代码:
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;
}
}
答案 0 :(得分:0)
解决方案就在这里,当按下开始按钮时,活动现在会从最后一个位置写一条线到新位置。这是代码。该代码每5秒生成一条折线。如果您正在制作谷歌地图应用程序,我希望你们中的一些人可以使用它。
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
}
}