Google地图位置更新和标记定位

时间:2015-07-28 04:11:10

标签: android google-maps android-layout location google-maps-markers

我可以在地图中添加多个标记,但每次再次打开应用程序时,都会清除添加的标记,并且只显示当前位置的一个标记。我现在的代码如下所示,我应该做些什么更改以获得恒定的位置坐标更新并保存标记,以便每次打开地图时它们都存在。

public class MainActivity extends FragmentActivity implements View.OnClickListener {

public static final String mapLongitude="longitude";
public static final String mapLatitude="latitude";
FragmentManager fm = getSupportFragmentManager();
Button displayareas;



private GoogleMap newmap; // Might be null if Google Play services APK is not available.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    displayareas = (Button) findViewById(R.id.display);
    displayareas.setOnClickListener(this);
    Log.d("Map","MapCreated");
    setUpMapIfNeeded();

}
@Override
public void onClick(View v) {
    if(v.getId()==R.id.display){
        Intent intent = new Intent(this, AllAreas.class);

        startActivity(intent);
    }

}

@Override
protected void onResume() {
    super.onResume();
    setUpMapIfNeeded();
}


private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (newmap == null) {
        // Try to obtain the map from the SupportMapFragment.
        newmap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (newmap != null) {
            setUpMap();
            Log.d("MAPS","Map working");


        }
        else Log.d("MAPS","not working");

    }
}


private void setUpMap() {

    newmap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));

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

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

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

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

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

    // set map type
    newmap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    // Get latitude of the current location
    double latitude = myLocation.getLatitude();

    // Get longitude of the current location
    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
    newmap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

    // Zoom in the Google Map
    newmap.animateCamera(CameraUpdateFactory.zoomTo(20));
    newmap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My location"));

    Log.d("LATITUDE",String.valueOf(latitude));
    Log.d("LONGITUDE",String.valueOf(longitude));
    GoogleMap.OnMarkerClickListener listener = new GoogleMap.OnMarkerClickListener() {

        @Override
        public boolean onMarkerClick(final Marker marker) {

            AddGeofenceFragment dFragment = new AddGeofenceFragment();
            // Show DialogFragment
            dFragment.show(fm, "Dialog Fragment");
            return true;
        }

    };

    newmap.setOnMarkerClickListener(listener);

    newmap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

        @Override
        public void onMapClick(LatLng latLng) {

            // Creating a marker
            MarkerOptions markerOptions = new MarkerOptions();

            // Setting the position for the marker
            markerOptions.position(latLng);

            // Setting the title for the marker.
            // This will be displayed on taping the marker
            markerOptions.title(latLng.latitude + " : " + latLng.longitude);


            // Animating to the touched position
            newmap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

            // Placing a marker on the touched position
            newmap.addMarker(markerOptions);
            Log.d("ADDED LATITUDE",String.valueOf(latLng.latitude));
            Log.d("ADDED LONGITUDE",String.valueOf(latLng.longitude));

            Toast.makeText(getApplicationContext(),"Block area updated",Toast.LENGTH_LONG).show();



        }
    });

}

}

3 个答案:

答案 0 :(得分:0)

  1. 在定位更新时,我建议使用FusedLocationAPI here作为链接。
  2. 关于标记被移除的原因。您可以尝试删除onResume()中的setUpMapIfNeeded()方法吗?

答案 1 :(得分:0)

我的想法是重新打开应用程序会重新初始化地图,并且所有点都不会重新初始化。老实说,我不认为他们会留下来。这不是我期望的行为。如果我希望它们留下来,我可能会尝试使用SQLite保存点数。这肯定会保存它们,但是你需要考虑你的标记删除用户体验。

答案 2 :(得分:0)

如果你想在下次打开app时显示标记..请将每个lat和long标记保存到某处(SharedPreference或SQLite ..),并在onCreate()中调用此数据以在地图中呈现..

newmap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

    @Override
    public void onMapClick(LatLng latLng) {

        // Creating a marker
        MarkerOptions markerOptions = new MarkerOptions();

        // Setting the position for the marker
        markerOptions.position(latLng);

        // Setting the title for the marker.
        // This will be displayed on taping the marker
        markerOptions.title(latLng.latitude + " : " + latLng.longitude);


        // Animating to the touched position
        newmap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

        // Placing a marker on the touched position
        newmap.addMarker(markerOptions);
        Log.d("ADDED LATITUDE",String.valueOf(latLng.latitude));
        Log.d("ADDED LONGITUDE",String.valueOf(latLng.longitude));

        //Save it to SharedPreference or SQLite .
        Toast.makeText(getApplicationContext(),"Block area updated",Toast.LENGTH_LONG).show();



    }
});