Google Map API V2

  • Hallo zusammen,
    ich hab mit der API V2 eine Karte eingebunden.
    Die Routenverfolgung , Zoom, usw. klappt super.
    Weiss jemand, wie ich den "Movingpoint" in der Kartenmitte halten kann, sprich die Karte bewegt sich hinter dem aktuellen Standort, und nicht umgekehrt?


    der Pfeil läuft mir aus dem Bildrand raus.


    folgendes hab ich in der onLocationChanged gemacht:

  • Keine Ahnung.
    Ich habe auch das Problem, dass mir die Maps permanent abschmiert, wenn das Gerät aus dem Standby aufwacht. Und zwar mit irgendwelchen kruden ClassDefNotFound Exceptions, die ich überhaupt nicht nachvollziehen kann.


    Ich glaub, ich lass einfach die Finger davon und schau mich auf dem OpenStreetMap Sektor um.
    Mit der Google Maps Geschichte bin ich jedenfalls mindestens unzufrieden.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Wenn es bei dir nicht funktioniert zeig mal weiteren Sourcecode her. Nicht das du evtl. mehrere Map Instanzen hast ^^


    Funktioniert:



    @Lucas
    Die Mapv2 ist schon sehr schön. Hatte bislang nur einmal kurz ein Problem damit (Fragment in Fragment). Die Map exisitiert ja "leider" nur als Fragment und hatte ich damals direkt ins Layout gesetzt. Laut Google ist dies erst ab Version (4.1?) ok Fragments zu schachteln. Dann aber auch nur Programmatisch. Mit der Support Library läuft es natürlich auch schön unter 4.1.

  • hier ist die komplette Activity.
    Ich sehe nur eine Instanz der Map :sleeping:






    import android.app.Activity;
    import android.app.Dialog;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.preference.PreferenceManager;
    import android.support.v4.app.FragmentActivity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.TextView;
    //import android.support.v4.app.FragmentTransaction;




    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
    import com.google.android.gms.common.GooglePlayServicesUtil;
    import com.google.android.gms.location.LocationListener;
    import com.google.android.gms.maps.*;
    import com.google.android.gms.maps.model.CameraPosition;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.maps.GeoPoint;
    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapView;
    import com.google.android.maps.MyLocationOverlay;


    public class PKarte extends FragmentActivity implements android.location.LocationListener{


    private MapView mapView;
    private MyLocationOverlay myLocationOverlay;
    public boolean autozoom = false;
    private GoogleMap googleMap;
    CameraPosition cameraPosition;
    TextView tvLocation;
    LocationManager locationManager;
    private int kartentype = 1;

    /** Called when the activity is first created. */


    /*************************************************************************************
    *
    * onCreate
    *
    ************************************************************************************/
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    // main.xml contains a MapView
    setContentView(R.layout.map_layout);
    tvLocation = (TextView) findViewById(R.id.tv_location);


    }



    /*************************************************************************************
    *
    * onResume
    *
    ************************************************************************************/



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


    /**********************************************
    * relevante Benutzereinstellungen lesen
    *
    **********************************************/
    SharedPreferences getEinstellungen = PreferenceManager.getDefaultSharedPreferences(getBaseContext());



    kartentype = Integer.valueOf(getEinstellungen.getString("karteneinstellungen1","1"));


    karteAnzeigen();
    }


    @Override
    protected void onPause() {
    super.onPause();



    }


    @Override
    public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub




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


    // Getting longitude of the current location
    double longitude = location.getLongitude();


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


    // .target(latLng) // Sets the center of the map to Mountain View
    // Setting latitude and longitude in the TextView tv_location
    tvLocation.setText("Latitude:" + latitude + ", Longitude:"+ longitude );
    cameraPosition = new CameraPosition.Builder()
    .target(new LatLng(location.getLatitude(),location.getLongitude()))
    .zoom(15) // Sets the zoom
    .bearing(180) // Sets the orientation of the camera to xy
    .tilt(30) // Sets the tilt of the camera to 30 degrees
    .build(); // Creates a CameraPosition from the builder




    // Showing the current location in Google Map
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    locationManager.removeUpdates(this);

    }


    @Override
    public void onProviderDisabled(String arg0) {
    // 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


    }


    /**************************************************************
    * Karte anzeigen
    *
    *************************************************************/

    private void karteAnzeigen() {
    // Getting Google Play availability status
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());




    // Showing status
    if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available


    int requestCode = 10;
    Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
    dialog.show();


    }else { // Google Play Services are available


    // Getting reference to the SupportMapFragment of amap_layout.xml
    SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);


    // Getting GoogleMap object from the fragment
    googleMap = fm.getMap();
    /* zur internen Info Integerwerte
    * GoogleMap.MAP_TYPE_NORMAL = 1
    * GoogleMap.MAP_TYPE_SATELLITE = 2
    * GoogleMap.MAP_TYPE_TERRAIN = 3
    * GoogleMap.MAP_TYPE_HYBRID = 4;
    */
    googleMap.getUiSettings().setCompassEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);
    googleMap.getUiSettings().isTiltGesturesEnabled();


    // Enabling MyLocation Layer of Google Map
    googleMap.setMyLocationEnabled(true);
    googleMap.setMapType(kartentype);


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


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


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


    // Getting Current Location
    Location location = locationManager.getLastKnownLocation(provider);
    LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
    // Showing the current location in Google Map



    if(location!=null){


    onLocationChanged(location);
    }



    locationManager.requestLocationUpdates(provider, 20000, 0, this);
    // locationManager.requestLocationUpdates(provider, 10000, 0, this); // 10 sec
    }
    }


    /****************************************************************************************************
    *
    * Komplettes Menuehandling
    ******************************************************************************************************/
    // Menuehandling
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.karten_menue1, menu);
    return true;
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
    case R.id.itemKarteneinstellungen:


    startActivity(new Intent(this, Karteneinstellungen.class));



    return true;


    default:
    return super.onOptionsItemSelected(item);
    }
    }



    }
    [/code]


    EDIT: drumliner ich hab mal das
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    rausgenommen, setzt mich jetz mal ins auto und will sehen ob das die Ursache ist :)
    EDIT2: was verhagelt denn hier die Code-tags ??

  • Hab mir das jetzt nur kurz angesehen, aber willst du das wirklich an dieser Stelle ;) ?


    locationManager.removeUpdates(this);


    Du nimmst demnach die locationUpdates raus. So wie ich das sehe, wird derzeit, wenn die letzte Location vorhanden ist diese über onLocationChanged gesetzt (was auch funktionieren dürfte). Danach nimmst du die Updates raus und geupdatet wird nichts weiter, ergo keine Positionswechsel der Kamera.




    bzgl. Codetags: Ich habe mit dem Safari und den Tags auch ständig Probleme ;)

  • nee natürlich nicht. ist wohl beim Rumprobieren stehen geblieben :(


    was ich noch nicht kapiert habe ist der Unterschied zwischen:


    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

  • alsoo
    damit die Zommveränderungen des Benutzers nicht bei jedem Update der Location zurückgesetzt werden,
    habe ich den zoom jetzt aus der onLocationChanged rausgenommen und nur zu Anfang gesetzt:


    CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);
    googleMap.animateCamera(zoom);


    in der onLocationChanged wird nur noch
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); aufgerufen.




    Das funktioniert alles, solange ich mich nicht zu schnell bewege.
    Bei schnellerer Autofahrt, kommt der Punkt nicht mehr mit :(
    Ich gehe mal davon aus dass jetzt die Parameter der
    locationManager.requestLocationUpdates(provider, 20000, 0, this); verändert werden müssen.



    Lieg ich damit richtig?


    Danke für eure Meinungen



  • Richtig du musst nur die 20000 entsprechend verringern. ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • also sollten googleMap.animateCamera(...); und googleMap.moveCamera(...) nicht gleichzeitig verwendet werden? verstehe ich das richtig?? Bildet das einen Nachteil ?? weil den unterschied habe ich auch nicht 100%ig geschnallt, da ich bis jetzt davon ausging, dass das eine für den zoom und das andere zum verschieben der karte gedacht war.


    ich hab das auch mal getestet mit folgendem code:

    Code
    locationmanager.requestLocationUpdates(provider, 1000, 0, this);  
    ....
    myMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    myMap.animateCamera(CameraUpdateFactory.zoomTo(17));


    bzw. auch so: myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17));


    irgendwie scheint der pfeil nicht hinterzukommen, obwohl ich es so eingestellt habe, dass jede sekunde die karte zum standort zentrieren soll. Es dauert auf jeden fall länger als 1 sekunde bzw. springt der zum aktuellen punkt voll abgehackt. es ist auf jedenfall kein flüssiger übergang (auch wenn ich anstatt 1000, 0 einstetze).

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!