Android Google Maps API V2 Auf aktuellen Standort zoomen

74

Ich versuche, mit der Karten-API V2 herumzuspielen, um mich besser damit vertraut zu machen, und ich versuche, die Karte zentriert am aktuellen Standort des Benutzers zu starten. Mit der map.setMyLocationEnabled(true);Anweisung kann ich meinen aktuellen Standort auf der Karte anzeigen. Dadurch wird auch die Schaltfläche zur Benutzeroberfläche hinzugefügt, mit der die Karte an meinem aktuellen Standort zentriert wird.

Ich möchte diesen Tastendruck in meinem Code simulieren. Ich bin mit den Klassen und vertraut LocationManagerund LocationListenererkenne, dass die Verwendung dieser Klassen eine praktikable Alternative ist, aber die Funktionalität zum Zentrieren und Vergrößern des Standorts des Benutzers scheint bereits über die Schaltfläche integriert zu sein.

Wenn die API über eine Methode verfügt, um den aktuellen Standort des Benutzers anzuzeigen, muss es sicherlich eine einfachere Möglichkeit geben, sich auf den Standort zu konzentrieren, als die Klassen LocationManager/ zu LocationListenerverwenden, oder?

user139260
quelle
Der wichtigste Punkt hierbei ist, die Geokoordinaten des aktuellen Standorts zu ermitteln. Sie können die GPS-Bibliothek verwenden, um das zu bekommen. Sobald Sie die Geokoordinaten haben, ist es trivial. Weitere Informationen finden Sie im Folgenden: stackoverflow.com/questions/17519198/…
user846316

Antworten:

111

Versuchen Sie diese Codierung:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();

Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
if (location != null)
{
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 13));

    CameraPosition cameraPosition = new CameraPosition.Builder()
        .target(new LatLng(location.getLatitude(), location.getLongitude()))      // Sets the center of the map to location user
        .zoom(17)                   // Sets the zoom
        .bearing(90)                // Sets the orientation of the camera to east
        .tilt(40)                   // Sets the tilt of the camera to 30 degrees
        .build();                   // Creates a CameraPosition from the builder
    map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));       
}
user3161982
quelle
1
Was ist, wenn der Standort == null
..
@jyomin Hier finden Sie meine Antwort, wie Sie den Benutzerstandort ermitteln können. Es verwendet die oben beschriebene Methode mit ein wenig Ausfallsicherheit, um den nächstbesten Standort des Benutzers zu überprüfen. stackoverflow.com/a/14511032/845038 Dies kann Abhilfe schaffen, indem der nächstbeste Speicherort überprüft wird.
DMCApps
1
Diese Lösung ist einfach und funktioniert einfach. Vielen Dank.
Enkk
Dies funktioniert nicht für mich auf Android 4.2.1, aber auf meinem Nexus 7 Tablet mit Android 5. Könnten Sie bitte dabei helfen?
Farid bekran
The Google Play services location APIs are preferred over the Android framework location APIs (android.location) as a way of adding location awareness to your app.Diese Methode ist alt. Bitte überprüfen Sie developer.android.com/training/location/index.html
Gokhan Arik
45

Nachdem Sie das Kartenobjekt (aus dem Fragment) instansiiert haben, fügen Sie Folgendes hinzu:

private void centerMapOnMyLocation() {

    map.setMyLocationEnabled(true);

    location = map.getMyLocation();

    if (location != null) {
        myLocation = new LatLng(location.getLatitude(),
                location.getLongitude());
    }
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation,
            Constants.MAP_ZOOM));
}

Wenn Sie eine Anleitung benötigen, fragen Sie einfach, diese sollte jedoch selbsterklärend sein. Installieren Sie einfach das myLocation-Objekt für ein Standardobjekt ...

crazyPixel
quelle
1
Ich habe das gleiche Problem, aber wenn ich versuche, map.getMyLocation () zu verwenden, werde ich gewarnt, dass diese Methode veraltet ist. Was wäre jetzt der richtige Weg?
Pam
15
"getMyLocation () Diese Methode ist veraltet. Verwenden Sie stattdessen LocationClient. LocationClient bietet eine verbesserte Standortsuche und einen verbesserten Stromverbrauch und wird vom blauen Punkt" Mein Standort "verwendet. Siehe Beispiel für MyLocationDemoActivity im Beispielanwendungsordner, Beispielcode, oder den Standortentwickler Führen." (entnommen von der Android-Entwickler-Website) Wenn Sie das nächste Mal die API lesen, wenn etwas veraltet ist, gibt es einen Ersatz dafür
crazyPixel
5
LocationClient wurde als veraltet markiert. Sie müssen stattdessen LocationServices verwenden
Lars Nielsen
Ich denke, Constants.MAP_ZOOM soll die von uns definierte Zoomstufe sein?
AgentKnopf
@ Zainodis Sie raten richtig. Als Faustregel, wenn ich etwas schreibe, das von vorherigen Daten oder von Daten abhängt, die erfasst werden sollen, initiiere ich es für einen Standardwert.
crazyPixel
18
youmap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentlocation, 16));

16 ist die Zoomstufe

SHASHIDHAR MANCHUKONDA
quelle
1
Aber wie erhalte ich currentLocation ohne den LocationManager und den LocationListener? Oder ist das nicht möglich?
user139260
es ist nach meinem Wissen nicht möglich. und ich schlage vor, dass Sie den Standortmanager nicht verwenden. User Location Client, der eine hohe Genauigkeit und einen geringen Batterieverbrauch aufweist und einfach zu implementieren ist. developer.android.com/google/play-services/location.html neu gestartet von Google
SHASHIDHAR MANCHUKONDA
1
Standort location = map.getMyLocation (); Karte ist GoogleMap-Objekt
Venkat
1
Diese Lösung ist einfach und
charmant
Anstelle von 16 können Sie 14.0f
Däñish Shärmà
16
    mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location location) {

                CameraUpdate center=CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()));
                CameraUpdate zoom=CameraUpdateFactory.zoomTo(11);
                mMap.moveCamera(center);
                mMap.animateCamera(zoom);

        }
    });
mz87
quelle
2
Leider ist diese Methode jetzt veraltet :(
Antonio
1
Wenn Sie von Ihrem Standort wegblättern, kehren Sie einige Sekunden später zu Ihrem aktuellen Standort zurück, da Ihr Standort gerade aktualisiert wurde.
Jeffrey Liu
10

Versuchen Sie diesen Code:

private GoogleMap mMap;


LocationManager locationManager;


private static final String TAG = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(map);
    mapFragment.getMapAsync(this);

    arrayPoints = new ArrayList<LatLng>();
}

@Override
public void onMapReady(GoogleMap googleMap) {


    mMap = googleMap;


    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);


    LatLng myPosition;


    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    googleMap.setMyLocationEnabled(true);
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, true);
    Location location = locationManager.getLastKnownLocation(provider);


    if (location != null) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LatLng latLng = new LatLng(latitude, longitude);
        myPosition = new LatLng(latitude, longitude);


        LatLng coordinate = new LatLng(latitude, longitude);
        CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 19);
        mMap.animateCamera(yourLocation);
    }
}

}}

Vergessen Sie nicht, Berechtigungen für AndroidManifest.xml hinzuzufügen.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Gustavo
quelle
1
Willkommen bei Stack Overflow! Während dieser Code die Frage beantworten kann, ist es besser, eine Beschreibung dessen beizufügen, was das Problem war und wie Ihr Code das gegebene Problem angehen wird. Für die Zukunft, hier sind einige Informationen, wie man eine tolle Antwort auf Stack Overflow knackt
dirtydanee
4
private void setUpMapIfNeeded(){
    if (mMap == null){
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();//invoke of map fragment by id from main xml file

     if (mMap != null) {
         mMap.setMyLocationEnabled(true);//Makes the users current location visible by displaying a blue dot.

         LocationManager lm=(LocationManager)getSystemService(LOCATION_SERVICE);//use of location services by firstly defining location manager.
         String provider=lm.getBestProvider(new Criteria(), true);

         if(provider==null){
             onProviderDisabled(provider);
              }
         Location loc=lm.getLastKnownLocation(provider);


         if (loc!=null){
             onLocationChanged(loc);
      }
         }
     }
}

    // Initialize map options. For example:
    // mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

@Override
public void onLocationChanged(Location location) {

   LatLng latlng=new LatLng(location.getLatitude(),location.getLongitude());// This methods gets the users current longitude and latitude.

    mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng));//Moves the camera to users current longitude and latitude
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latlng,(float) 14.6));//Animates camera and zooms to preferred state on the user's current location.
}

    // TODO Auto-generated method stub

imm3000
quelle
Bitte fügen Sie eine Erklärung hinzu, was Ihr Code tut und wie er die Frage beantwortet, und formatieren Sie ihn ordnungsgemäß. Konvertieren Sie Tabulatoren in Leerzeichen, bevor Sie Code in SO kopieren, da Tabulatoren häufig nicht wie erwartet gerendert werden.
Adi Inbar
Die obige Lösung lädt ein Kartenfragment und zeigt eine zentrierte Position des aktuellen Standorts des Benutzers unter Verwendung der gewünschten Zoomstufe. In diesem Fall war meine (14.6) @AdiInbar
imm3000
Bitte fügen Sie die Erklärungen in die Antwort ein, anstatt in Kommentaren zu antworten, und formatieren Sie den Code. (Zu Ihrer Information, ich habe nicht aus persönlichem Interesse gefragt. Ich bin auf Ihre Antwort in der Überprüfungswarteschlange für Beiträge mit geringer Qualität gestoßen und habe Ihnen geraten, sie zu verbessern, um weitere Abstimmungen zu vermeiden und Stimmen zu löschen.)
Adi Inbar
3

Hier erfahren Sie, wie Sie dies in Kotlin ViewModelund FusedLocationProviderClientCode in Kotlin tun

locationClient.lastLocation.addOnSuccessListener { location: Location? ->
            location?.let {
                val position = CameraPosition.Builder()
                        .target(LatLng(it.latitude, it.longitude))
                        .zoom(15.0f)
                        .build()
                map.animateCamera(CameraUpdateFactory.newCameraPosition(position))
            }
        }
onmyway133
quelle
Ist das ratsam? Chainging mehrere Gegenstände wie locationClient.lastLocation.addOnSuccessListener{}?
Ssenyonjo
2

Dies funktioniert Aktueller Standort mit Zoom für Google Map V2

 double lat= location.getLatitude();
 double lng = location.getLongitude();
 LatLng ll = new LatLng(lat, lng);
 googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, 20));
Shreyans Patel
quelle
3
locationwirft den Fehler:Can not resolute symbol 'location'
Beckah
Die Frage ist, wie man die aktuellen Standortkoordinaten erhält und die Antwort ist hier: stackoverflow.com/a/17519248/846316
user846316
2

Schau dir das an:

    fun requestMyGpsLocation(context: Context, callback: (location: Location) -> Unit) {
        val request = LocationRequest()
        //        request.interval = 10000
        //        request.fastestInterval = 5000
        request.numUpdates = 1
        request.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        val client = LocationServices.getFusedLocationProviderClient(context)

        val permission = ContextCompat.checkSelfPermission(context,
            Manifest.permission.ACCESS_FINE_LOCATION )
        if (permission == PackageManager.PERMISSION_GRANTED) {
            client.requestLocationUpdates(request, object : LocationCallback() {
                override fun onLocationResult(locationResult: LocationResult?) {
                val location = locationResult?.lastLocation
                if (location != null)
                    callback.invoke(location)
            }
         }, null)
       }
     }

und

    fun zoomOnMe() {
        requestMyGpsLocation(this) { location ->
            mMap?.animateCamera(CameraUpdateFactory.newLatLngZoom(
                LatLng(location.latitude,location.longitude ), 13F ))
        }
    }
Dan Alboteanu
quelle