简体   繁体   中英

My Location is not shown on the screen on Google Map v2?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM