Как узнать текущее местоположение в Google Maps Android API v2?
С помощью
mMap.setMyLocationEnabled(true)
Можно установить включение слоя myLocation.
Но проблема в том, как получить myLocation, когда пользователь нажимает на кнопку? Я хочу получить долготу и широту.
13 ответов
Местоположение 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 обеспечивает улучшенный поиск местоположения и энергопотребление и используется синей точкой "Мое местоположение". См. Пример кода My LocationDemoActivity в папке с примерами приложений или примерное руководство разработчика.
В настоящий момент GoogleMap.getMyLocation() всегда возвращает ноль при любых обстоятельствах.
В настоящее время мне известны два сообщения об ошибках в Google, выпуск 40932 и 4644.
Реализация LocationListener, о которой говорилось ранее, будет неправильной, поскольку LocationListener будет не синхронизирован с LocationOverlay в новом API, который вы пытаетесь использовать.
После учебника на сайте Фогеллы, на который ранее ссылался Прамод Дж. Джордж, вы узнаете, как использовать более старый API Карт Google.
Поэтому я прошу прощения за то, что не дал вам метод, чтобы узнать ваше местоположение таким образом. На данный момент locationListener может быть единственным средством сделать это, но я уверен, что Google работает над устранением проблемы в новом API.
Также извините за то, что я не публикую больше ссылок, StackOverlow считает меня спамом, потому что у меня нет представителя.
---- Обновление от 4 февраля 2013 года ----
Google заявил, что проблема будет исправлена в следующем обновлении API Карт Google через выпуск 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.
Попробуйте и посмотрите, работает ли это...
Я нашел этот фрагмент кода простым и функциональным, попробуйте:
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.
}
Это даст текущее местоположение.
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));
Принятый ответ работает, но некоторые из используемых методов теперь устарели, так что я думаю, что лучше, если я отвечу на этот вопрос с обновленными методами.
это ответ полностью из этого руководства на разработчиков 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'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()
используется для настройки прослушивателя изменения местоположенияremoveLocationListener()
используется для удаления слушателя
Вызов initGoogleApiClient
способ, чтобы код начал работать:) Не забудьте удалить слушателя (mLocationListener
) в конце, чтобы избежать проблем утечки памяти.
Единственное условие, которое я проверял, это то, что оно не было нулевым: если вы дадите пользователю достаточно времени, чтобы прикоснуться к кнопке слоя "получить мое местоположение", тогда оно не получит нулевое значение.
Попробуй это
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();
}