it-swarm.com.de

Wie erhalte ich den aktuellen Standort in Google Maps Android API v2?

Verwenden 

mMap.setMyLocationEnabled(true)

kann den myLocation-Layer aktivieren.
Aber das Problem ist, wie Sie den myLocation abrufen, wenn der Benutzer auf die Schaltfläche klickt.

42
jjLin

Der Google Maps API-Speicherort funktioniert jetzt, auch wenn es Listener gibt. Sie können dies beispielsweise wie folgt tun:

private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
    @Override
    public void onMyLocationChange(Location location) {
        LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
        mMarker = mMap.addMarker(new MarkerOptions().position(loc));
        if(mMap != null){
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
        }
    }
};

und dann den Listener für die Karte einstellen:

mMap.setOnMyLocationChangeListener(myLocationChangeListener);

Dies wird aufgerufen, wenn die Karte den Ort zum ersten Mal findet.

Sie benötigen überhaupt keinen LocationService oder LocationManager.

OnMyLocationChangeListener-Schnittstelle ist veraltet . Verwenden Sie stattdessen com.google.Android.gms.location.FusedLocationProviderApi. FusedLocationProviderApi bietet eine verbesserte Suche nach Standort und Stromverbrauch und wird vom blauen Punkt "Mein Standort" verwendet. Beispielcode für MyLocationDemoActivity im Beispielanwendungsordner oder das Location Developer Guide.

56
yedidyak

Im Moment gibt GoogleMap.getMyLocation () unter allen Umständen immer null zurück. 

Derzeit gibt es zwei Fehlerberichte zu Google, die ich kenne, Ausgabe 40932 und Ausgabe 4644 .

Das Implementieren eines LocationListener wie zuvor ausgeführt wäre falsch, da der LocationListener nicht mit dem LocationOverlay in der neuen API, die Sie verwenden möchten, nicht synchron ist. 

Im Anschluss an das zuvor von Pramod J George verlinkte Tutorial auf der Website von Vogella erhalten Sie Anweisungen für die ältere Google Maps-API.

Ich entschuldige mich also dafür, dass ich Ihnen keine Methode gegeben habe, um Ihren Standort auf diese Weise abzurufen. Momentan ist der locationListener vielleicht die einzige Möglichkeit, dies zu tun, aber ich bin sicher, dass Google daran arbeitet, das Problem innerhalb der neuen API zu beheben. 

Es tut mir auch leid, dass ich nicht mehr Links gepostet habe. StackOverlow hält mich für Spam, weil ich keine Vertreter habe.

---- Update am 4. Februar 2013 ----

Google hat angegeben, dass das Problem bei der nächsten Aktualisierung des Google Maps-API über Problem 4644 behoben wird. Ich bin mir nicht sicher, wann das Update stattfinden wird, aber sobald dies der Fall ist, werde ich diesen Beitrag erneut bearbeiten. 

---- Update am 10. April 2013 ----

Google hat angegeben, dass das Problem über Problem 4644 behoben wurde. Es sollte jetzt klappen.

31
Ryan Kara

versuche dies 

LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = service.getBestProvider(criteria, false);
Location location = service.getLastKnownLocation(provider);
LatLng userLocation = new LatLng(location.getLatitude(),location.getLongitude());
19
JcKim

Stellen Sie sicher, dass Sie die Ortungsdienste auf dem Gerät eingeschaltet haben. Andernfalls erhalten Sie keine standortbezogenen Informationen.

Das funktioniert für mich,

    map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
    map.setMyLocationEnabled(true);
    GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange (Location location) {
           LatLng loc = new LatLng (location.getLatitude(), location.getLongitude());
           map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
        }
    };
    map.setOnMyLocationChangeListener(myLocationChangeListener);

}

3
rajnair

Um den Speicherort abzurufen, wenn der Benutzer auf eine Schaltfläche klickt, rufen Sie diese Methode in onClick -.__ auf.

void getCurrentLocation() {
    Location myLocation  = mMap.getMyLocation();
    if(myLocation!=null)
    {
        double dLatitude = myLocation.getLatitude();
        double dLongitude = myLocation.getLongitude();
        Log.i("APPLICATION"," : "+dLatitude);
        Log.i("APPLICATION"," : "+dLongitude);
        mMap.addMarker(new MarkerOptions().position(
                new LatLng(dLatitude, dLongitude)).title("My Location").icon(BitmapDescriptorFactory.fromBitmap(Utils.getBitmap("pointer_icon.png"))));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(dLatitude, dLongitude), 8));

    }
    else
    {
        Toast.makeText(this, "Unable to fetch the current location", Toast.LENGTH_SHORT).show();
    }

}

Stellen Sie auch sicher, dass die 

setMyLocationEnabled

ist auf true gesetzt.

Probieren Sie aus, ob dies funktioniert ...

2
Anukool

versuche dies

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
    mMap.setMyLocationEnabled(true);
} else {
    // Show rationale and request permission.
}
1
SHINTO JOSEPH

Ich fand dieses Code-Snippet einfach und funktionsfähig. 

public class MainActivity extends ActionBarActivity implements
    ConnectionCallbacks, OnConnectionFailedListener {
...
@Override
public void onConnected(Bundle connectionHint) {
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
    if (mLastLocation != null) {
        mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
        mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
    }
}}

hier ist der Link zum Tutorial: Den letzten bekannten Ort finden

1
ZAIRI Oussama

Hast du GoogleMap.getMyLocation() versucht?

1
Anthony

Nur eine Bedingung habe ich getestet, dass es nicht null war. Wenn Sie dem Benutzer genügend Zeit geben, um die Ebenen-Schaltfläche "Meine Position suchen" zu berühren, wird er keinen Nullwert erhalten.

0
Mehran

die akzeptierte Antwort funktioniert, aber einige der verwendeten Methoden sind nun veraltet. Ich denke, es ist am besten, wenn ich diese Frage mit aktualisierten Methoden beantworte.

dies ist die Antwort vollständig aus dieser Leitfaden für Google-Entwickler

hier ist also Schritt für Schritt Anleitung:

  1. implementieren Sie all dies in Ihrer Kartenaktivität

    MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks

  2. in deiner onCreate:

    private GoogleMap mMap;
    private Context context;
    private TextView txtStartPoint,txtEndPoint;
    private GoogleApiClient mGoogleApiClient;
    private Location mLastKnownLocation;
    private LatLng mDefaultLocation;
    private CameraPosition mCameraPosition;
    private boolean mLocationPermissionGranted;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    context = this;
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */,
                    this /* OnConnectionFailedListener */)
            .addConnectionCallbacks(this)
            .addApi(LocationServices.API)
            .addApi(Places.GEO_DATA_API)
            .addApi(Places.PLACE_DETECTION_API)
            .build();
    mGoogleApiClient.connect();
    }
    
  3. in deiner onConnected:

    SupportMapFragment mapFragment = (SupportMapFragment)     getSupportFragmentManager()
            .findFragmentById(map);
    mapFragment.getMapAsync(this);
    
  4. in deiner onMapReady:

    @Override
    public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    
    // Do other setup activities here too, as described elsewhere in this tutorial.
    
    // Turn on the My Location layer and the related control on the map.
    updateLocationUI();
    
    // Get the current location of the device and set the position of the map.
    getDeviceLocation();
    }
    
  5. und diese beiden sind Methoden in onMapReady:

    private void updateLocationUI() {
      if (mMap == null) {
        return;
    }
    
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            Android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        mLocationPermissionGranted = true;
    }
    
    if (mLocationPermissionGranted) {
        mMap.setMyLocationEnabled(true);
        mMap.getUiSettings().setMyLocationButtonEnabled(true);
    } else {
        mMap.setMyLocationEnabled(false);
        mMap.getUiSettings().setMyLocationButtonEnabled(false);
        mLastKnownLocation = null;
    }
    }
    
    private void getDeviceLocation() {
    if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            Android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        mLocationPermissionGranted = true;
    }
    
    if (mLocationPermissionGranted) {
        mLastKnownLocation = LocationServices.FusedLocationApi
                .getLastLocation(mGoogleApiClient);
    }
    
    // Set the map's camera position to the current location of the device.
    float DEFAULT_ZOOM = 15;
    if (mCameraPosition != null) {
        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(mCameraPosition));
    } else if (mLastKnownLocation != null) {
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                new LatLng(mLastKnownLocation.getLatitude(),
                        mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
    } else {
        Log.d("pouya", "Current location is null. Using defaults.");
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
        mMap.getUiSettings().setMyLocationButtonEnabled(false);
    }
    }
    

das ist sehr schnell, reibungslos und effektiv. hoffe das hilft

0
pouya

Der aktuelle Standort wird angezeigt.

mMap.setMyLocationEnabled(true);
Location userLocation = mMap.getMyLocation();
        LatLng myLocation = null;
        if (userLocation != null) {
            myLocation = new LatLng(userLocation.getLatitude(),
                    userLocation.getLongitude());
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation,
                    mMap.getMaxZoomLevel()-5));
0
Dinesh IT

Versuche dies 

public class MyLocationListener implements LocationListener
{

 @Override

public void onLocationChanged(Location loc)
{

loc.getLatitude();

loc.getLongitude();

String Text = “My current location is: ” +

“Latitud = ” + loc.getLatitude() +

“Longitud = ” + loc.getLongitude();

Toast.makeText( getApplicationContext(),Text,   Toast.LENGTH_SHORT).show();



tvlat.setText(“”+loc.getLatitude());

tvlong.setText(“”+loc.getLongitude());

this.gpsCurrentLocation();

}
0
Usman Kurd

Ich würde lieber FusedLocationApi verwenden, da OnMyLocationChangeListener veraltet ist.

Zuerst deklarieren Sie diese 3 Variablen:

private LocationRequest  mLocationRequest;
private GoogleApiClient  mGoogleApiClient;
private LocationListener mLocationListener;

Methoden definieren: 

private void initGoogleApiClient(Context context)
{
    mGoogleApiClient = new GoogleApiClient.Builder(context).addApi(LocationServices.API).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks()
    {
        @Override
        public void onConnected(Bundle bundle)
        {
            mLocationRequest = LocationRequest.create();
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            mLocationRequest.setInterval(1000);

            setLocationListener();
        }

        @Override
        public void onConnectionSuspended(int i)
        {
            Log.i("LOG_TAG", "onConnectionSuspended");
        }
    }).build();

    if (mGoogleApiClient != null)
        mGoogleApiClient.connect();

}

private void setLocationListener()
{
    mLocationListener = new LocationListener()
    {
        @Override
        public void onLocationChanged(Location location)
        {
            String lat = String.valueOf(location.getLatitude());
            String lon = String.valueOf(location.getLongitude());
            Log.i("LOG_TAG", "Latitude = " + lat + " Longitude = " + lon);
        }
    };

    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mLocationListener);
}

private void removeLocationListener()
{
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mLocationListener);
}
  • initGoogleApiClient() wird verwendet, um das Objekt GoogleApiClient zu initialisieren
  • setLocationListener() wird zum Einrichten des Listeners für den Ortsänderungswechsel verwendet
  • removeLocationListener() wird verwendet, um den Listener zu entfernen

Rufen Sie die Methode initGoogleApiClient auf, um den Code zu starten. :) Vergessen Sie nicht, den Listener (mLocationListener) am Ende zu entfernen, um Probleme mit dem Speicherverlust zu vermeiden.

0
Sa Qada