Используя
mMap.setMyLocationEnabled(true)
может установить уровень myLocation. Но проблема в том, как получить myLocation, когда пользователь нажимает кнопку? Я хочу получить долготу и широту.
Используя
mMap.setMyLocationEnabled(true)
может установить уровень myLocation. Но проблема в том, как получить myLocation, когда пользователь нажимает кнопку? Я хочу получить долготу и широту.
Теперь местоположение 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 в папке с образцами приложений, например, пример кода или Руководство разработчика по размещению.
В настоящий момент 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. Теперь он должен работать.
попробуйте это
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
так что это шаг за шагом:
реализовать все это в своей активности на карте
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);
}
}
это очень быстро, гладко и эффективно. надеюсь, что это поможет
Я предпочел бы использовать 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
) в конце, чтобы избежать проблем с утечкой памяти.