间隔更新位置

时间:2013-08-27 20:11:50

标签: android google-maps geolocation

这是我必须在Google地图上显示最后一个已知位置作为标记的当前代码。一切都很实用,但我想在一个间隔(比如1分钟或5分钟)更新位置。鉴于我正在使用的当前代码,实现这个的最佳方法是什么?

import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class Parking extends Activity implements OnClickListener {

    private GoogleMap map;

    Button b;

    public static final String LATITUDE = "latitude";
    public static final String LONGITUDE = "longitude";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.parking);

        b = (Button)findViewById(R.id.button1);
        b.setOnClickListener(this);

        map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

        if (map!=null)
        {       

        //Set Map Type
        map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

        //Enable MyLocation Layer of Google Map
        map.setMyLocationEnabled(true);

        //Get LocationManager object from System Service LOCATION_SERVICE
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        //Create a criteria object to retrieve provider
        Criteria criteria = new Criteria();

        //Get the best provider
        String provider = locationManager.getBestProvider(criteria, true);

        //Get Current Location
        Location myLocation = locationManager.getLastKnownLocation(provider);

        //Get Lat/Long of the current location
        double latitude = myLocation.getLatitude();
        double longitude = myLocation.getLongitude();

        //Create a latLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

        //Show the current location in Google Map
        map.moveCamera(CameraUpdateFactory.newLatLng(latLng));

        //Zoom to location
        map.animateCamera(CameraUpdateFactory.zoomTo(16));

        //Add marker
        map.addMarker(new MarkerOptions()
            .position(new LatLng(latitude, longitude))
            .title("You Are Here")
        );




        }//end if map !null
    }

2 个答案:

答案 0 :(得分:1)

您可以使用LocationManager类的requestLocationUpdates方法 - http://developer.android.com/reference/android/location/LocationManager.html

您可以指定以毫秒为单位的时间间隔以及以米为单位的最小距离变化。

我的建议是切换到最新的Location API,如下所述:https://developer.android.com/google/play-services/location.html

答案 1 :(得分:0)

借助Google新推出的融合定位服务器,您可以更轻松地获取该位置或获取定期更新!请参阅此链接,这可能非常有用

https://developer.android.com/training/location/receive-location-updates.html

您需要的只是导入google-play服务项目,

您也可以使用后台服务获取定期更新。

public class UpdateLocation extends Service
        implements
            GooglePlayServicesClient.ConnectionCallbacks,
            GooglePlayServicesClient.OnConnectionFailedListener,
            LocationListener {

private static final long UPDATE_INTERVAL = 300000;
private static final int FASTEST_INTERVAL = 60000;
private LocationRequest lr;
private LocationClient lc;
private Location l;

@Override
public void onCreate() {
    super.onCreate();
    lr = LocationRequest.create();
    lr.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    lr.setInterval(UPDATE_INTERVAL);
    lr.setFastestInterval(FASTEST_INTERVAL);
    lc = new LocationClient(this, this, this);
}


@Override
public void onStart(Intent intent, int startId) {
    lc.connect();

}

@Override
public void onLocationChanged(Location l) {
 //do updates on Location change.
}

@Override
public void onConnectionFailed(ConnectionResult arg0) {

}

@Override
public void onConnected(Bundle arg0) {
    Log.d("AutoTracker : Test", "Location Client Connected");
    if (updates) {
        lc.requestLocationUpdates(lr, this);
    }

}

@Override
public void onDestroy() {
    if (lc.isConnected()) {
        lc.removeLocationUpdates(this);
    }
    lc.disconnect();
}

@Override
public void onDisconnected() {
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

}