我的位置没有显示在谷歌地图v2的屏幕上



我正在制作一个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;
}       

}

解决方案在这里,活动现在写一行从你的最后一个位置到你的新位置,当开始按钮被按下。下面是代码。代码每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
}

}

最新更新