Как получить текущее местоположение в Google Maps Android API v2?

С помощью

mMap.setMyLocationEnabled(true) 

Может установить уровень myLocation.
Но проблема в том, как получить myLocation, когда пользователь нажимает кнопку? Я хочу получить долготу и широту.

Solutions Collecting From Web of "Как получить текущее местоположение в Google Maps Android API v2?"

Теперь местоположение API Карт Google работает, даже есть слушатели, вы можете сделать это, используя это, например:

 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)); } } }; 

А затем установите прослушиватель для карты:

 mMap.setOnMyLocationChangeListener(myLocationChangeListener); 

Это вызовет вызов, когда карта сначала найдет местоположение.

Нет необходимости в LocationService или LocationManager вообще.

Интерфейс OnMyLocationChangeListener устарел. Вместо этого используйте com.google.android.gms.location.FusedLocationProviderApi. FusedLocationProviderApi обеспечивает улучшенное определение местоположения и использование энергии и используется синей точкой «Мое местоположение». См. MyLocationDemoActivity в папке с образцами приложений, например, пример кода или Руководство разработчика.

В настоящий момент GoogleMap.getMyLocation () всегда возвращает значение null при любых обстоятельствах.

В настоящее время есть два отчета об ошибках в отношении Google, о которых я знаю, Issue 40932 и Issue 4644 .

Внедрение LocationListener, как было показано выше, было бы неверным, потому что LocationListener не синхронизировался с LocationOverlay в новом API, который вы пытаетесь использовать.

Следуя учебному пособию на сайте Vogella, ранее связанному с Pramod J George, вы дадите указания для более старого API Карт Google.

Поэтому я приношу свои извинения за то, что вы не предоставили вам способ получить свое местоположение с помощью этого средства. На данный момент locationListener может быть единственным средством для этого, но я уверен, что Google работает над устранением проблемы в новом API.

Также жаль, что не публикует больше ссылок, StackOverlow думает, что я спам, потому что у меня нет репутации.

—- Обновление от 4 февраля 2013 г. ——

Google заявила, что проблема будет исправлена ​​в следующем обновлении API Карт Google через Issue 4644 . Я не уверен, когда произойдет обновление, но как только это произойдет, я снова отредактирую этот пост.

—- Обновление от 10 апреля 2013 г. ——

Google заявила, что проблема устранена с помощью проблемы 4644 . Теперь он должен работать.

попробуй это

 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()); 

Убедитесь, что вы включили службы определения местоположения на устройстве. Кроме того, вы не получите информацию о местоположении.

Это работает для меня,

  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); 

}

Чтобы получить местоположение, когда пользователь нажимает кнопку, вызовите этот метод в onClick-

 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(); } } 

Также убедитесь, что

setMyLocationEnabled

Установлено значение true .

Попробуйте посмотреть, работает ли это …

Вы пробовали GoogleMap.getMyLocation() ?

Я просто нашел этот фрагмент кода простым и функциональным, попробуйте:

 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())); } }} 

Вот ссылка учебника: Получение последнего известного места

попробуй это

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

Попробуй это

 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(); } 

Это даст текущее местоположение.

 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)); 

Только одно условие, я тестировал, что это не было null, если вы позволите пользователю достаточно времени нажать кнопку слоя «получить мое местоположение», то он не получит нулевое значение.

Принятый ответ работает, но некоторые из используемых методов теперь устарели, поэтому я думаю, что лучше всего, если я отвечу на этот вопрос с помощью обновленных методов.

Это ответ полностью из этого руководства для разработчиков Google

Так вот пошаговое руководство:

  1. Реализовать все это в своей картографической деятельности

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

  2. В вашем 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. В вашем onConnected :

     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(map); mapFragment.getMapAsync(this); 
  4. В вашем 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. И эти два метода в 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); } } 

Это очень быстро, гладко и эффективно. надеюсь это поможет

Я предпочел бы использовать FusedLocationApi поскольку OnMyLocationChangeListener устарел.

Сначала объявите эти 3 переменные:

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

Определить методы:

 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() используется для инициализации объекта GoogleApiClient
  • setLocationListener() используется для настройки setLocationListener() изменения местоположения
  • removeLocationListener() используется для удаления слушателя

Вызовите метод initGoogleApiClient для запуска кода. Не забудьте удалить слушателя ( mLocationListener ) в конце, чтобы избежать проблем с утечкой памяти.