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

Используя

mMap.setMyLocationEnabled(true)

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

Ответ 1

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

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 в папке с образцами приложений, например, пример кода или Руководство разработчика по размещению.

Ответ 2

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

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

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

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

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

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

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

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

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

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

Ответ 3

попробуйте это

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

Ответ 4

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

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

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

}

Ответ 5

Чтобы получить местоположение, когда пользователь нажимает кнопку, вызовите этот метод в 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.

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

Ответ 7

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

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

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

Ответ 8

попробуйте это

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

Ответ 9

Попробуйте это

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

}

Ответ 10

Он отобразит текущее местоположение.

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

Ответ 11

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

Ответ 12

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

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

так что это шаг за шагом:

  • реализовать все это в своей активности на карте

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

  • в 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();
    }
    
  • в onConnected:

    SupportMapFragment mapFragment = (SupportMapFragment)     getSupportFragmentManager()
            .findFragmentById(map);
    mapFragment.getMapAsync(this);
    
  • в 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();
    }
    
  • и эти два являются методами в 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 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);
    }
    }
    

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

Ответ 13

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

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