ユーザーの正しい位置を取得し、それを HashMap に入れて別のレイアウトでルートを表示できる Android アプリケーションを作成しています。
とにかく私の質問は、場所が変更されたときに場所管理者が Google マップの場所を変更しないのはなぜですか、そのポイントが正しい位置に変更されるのを見ることができますが、カメラが離れないため、私の場所は画面の中央に表示されます画像 理由を教えてください。
計画では、地図上で行ったルートを表示して、古い位置から新しい位置への 1 つのポリラインが表示されるようにしますが、最初のカメラは正しい位置に移動します
これが私のコードです:
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;
}
}