#android #google-maps #map #geolocation #userlocation
#Android #google-карты #словарь #геолокация #местоположение пользователя
Вопрос:
Я использую следующий код, чтобы получить свое текущее местоположение. Но проблема, с которой я сталкиваюсь, заключается в том, что он всегда возвращает 0.0 для широты и долготы. Я включил настройки GPS в телефоне и установил все разрешения. Но все же я сталкиваюсь с этим.
locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
customLocationListener = new CustomLocationListener();
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
0,
0,
customLocationListener);
class CustomLocationListener implements LocationListener{ ............
public void onLocationChanged(Location argLocation) {
if(location != null) {
int latitude=(int)(argLocation.getLatitude()*1E6);
int longitude=(int)(argLocation.getLongitude()*1E6);
}
} ........ }
Кто-нибудь из вас знает, почему?
Примечание: моя активность расширяет MapActivity, а не Location Listener
Комментарии:
1. для эмулятора .. вы отправили географические точки из элемента управления эмулятором?
2. Вы уверены, что у вас есть исправление GPS? Карта может использовать
PASSIVE_PROVIDER
провайдера для отображения текущего местоположения (т. Е. Может даже не использовать GPS).3. широта и долгота должны быть двойными, а не целыми числами, каким должен быть 1E6?
4. вы проверяете его на телефоне или на телефоне … если он включен в эмулятор, вам нужно отправить lat-lon вручную из ddms, как сказал @MayurParekh.
5. @hanry.. Я проверяю только телефон, а не в эмуляторе.
Ответ №1:
также проверьте, что это одна из причин. Перейдите в приложение maps по умолчанию и разрешите пользователю разрешить широту и долготу.В нашем приложении, когда сигнал GPS мигает и когда он останавливается, мы получаем широту и долготу. Это сработало для меня
Редактировать 1
-
Откройте приложение Google Maps и нажмите кнопку на карте, чтобы получить текущее местоположение.
-
Когда вы разрешаете разрешение Google map, будут работать только разрешения других приложений. (и я чувствую, что это большая ошибка)
-
Теперь перейдите в свое приложение и попытайтесь получить текущее местоположение, и оно будет работать.
Это некрасиво, но мы должны выполнить эти шаги, чтобы получить текущее местоположение в нашем приложении.
Ответ №2:
попробуйте этот способ
locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
Criteria locationCritera = new Criteria();
String providerName = locationManager.getBestProvider(locationCritera,
true);
if(providerName!=null)
location = locationManager.getLastKnownLocation(providerName);
locationListener = new MyLocationListener();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locationListener);
в mylocationlistener задайте свой объект местоположения
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location loc) {
if (loc != null) {
location = loc;
}
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
Комментарии:
1. @ Mayur Parekh…am получение null для местоположения, если я делаю location = LocationManager.getLastKnownLocation(ProviderName); Я получил значение для поставщика как gps.
2. Я понял, в чем проблема, это было потому, что место, где я сижу, не получало надлежащего GPS-соединения ..!! Я попробовал в эмуляторе путем жесткого кодирования широты и долготы, тогда это работает. Вывод: лучше попробовать в эмуляторе для теста, чтобы получить текущее местоположение пользователя
3. Можете ли вы сказать мне, как получить адрес местоположения пользователя, т.Е. Не Координаты, а полный адрес, где он в настоящее время находится
4. вы должны опубликовать это как новый вопрос. в любом случае вы можете использовать класс геокодера Geocoder geocoder = новый геокодер (this, Locale.getDefault()); Список <Адрес> адреса = geocoder.getFromLocation(широта, спг, 1);
5. Привет, код в принятом ответе работает нормально. Вы можете следовать этому. Убедитесь, что вы находитесь за пределами здания, иногда, если вы проверяете внутри здания, это может не сработать!!
Ответ №3:
Вот что вы хотите ..!
public void getCurrentLocation() {
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager) getSystemService(context);
Criteria crta = new Criteria();
crta.setAccuracy(Criteria.ACCURACY_FINE);
crta.setAltitudeRequired(false);
crta.setBearingRequired(false);
crta.setCostAllowed(true);
crta.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(crta, true);
locationManager.requestLocationUpdates(provider, 1000, 0,
new LocationListener() {
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(Location location) {
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
if (lat != 0.0 amp;amp; lng != 0.0) {
System.out.println("WE GOT THE LOCATION");
System.out.println(lat);
System.out.println(lng);
}
}
}
});
}
Комментарии:
1. @Noby… Я пытался, но получаю 0.0 в строке double lat = location.getLatitude(); Так что моя проблема продолжалась.
2. выключите gps, затем попробуйте …! Убедитесь, что у вас достаточно времени, чтобы получить информацию о вашем местоположении. (подождите пять минут).
Ответ №4:
CustomLocationManager.Java
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class CustomLocationManager {
private LocationManager mLocationManager;
private LocationValue locationValue;
private Location networkLocation = null;
private Location gpsLocation = null;
private Timer mTimer;
private boolean isGpsEnabled = false;
private boolean isNetworkEnabled = false;
private static CustomLocationManager _instance;
private CustomLocationManager() {}
public static CustomLocationManager getCustomLocationManager() {
if (_instance == null) {
_instance = new CustomLocationManager();
}
return _instance;
}
public LocationManager getLocationManager(Context context) {
if (mLocationManager == null)
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return mLocationManager;
}
public boolean getCurrentLocation(Context context, LocationValue result) {
locationValue = resu<
if (mLocationManager == null)
mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
try {
isGpsEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {}
try {
isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {}
if (!isGpsEnabled amp;amp; !isNetworkEnabled)
return false;
if (isGpsEnabled)
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, gpsLocationListener);
if (isNetworkEnabled)
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, networkLocationListener);
mTimer = new Timer();
mTimer.schedule(new GetLastKnownLocation(), 20000);
return true;
}
LocationListener gpsLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
mTimer.cancel();
locationValue.getCurrentLocation(location);
mLocationManager.removeUpdates(this);
mLocationManager.removeUpdates(networkLocationListener);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
private LocationListener networkLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
mTimer.cancel();
locationValue.getCurrentLocation(location);
mLocationManager.removeUpdates(this);
mLocationManager.removeUpdates(gpsLocationListener);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
private class GetLastKnownLocation extends TimerTask {
CurrentLocationHandler handler;
GetLastKnownLocation() {
handler = new CurrentLocationHandler();
}
@Override
public void run() {
mLocationManager.removeUpdates(gpsLocationListener);
mLocationManager.removeUpdates(networkLocationListener);
if (isGpsEnabled)
gpsLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (isNetworkEnabled)
networkLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
handler.sendEmptyMessage(0);
}
}
private class CurrentLocationHandler extends Handler {
@Override
public final void handleMessage(Message msg) {
if (gpsLocation != null amp;amp; networkLocation != null) {
if (gpsLocation.getTime() > networkLocation.getTime())
locationValue.getCurrentLocation(gpsLocation);
else
locationValue.getCurrentLocation(networkLocation);
return;
}
if (gpsLocation != null) {
locationValue.getCurrentLocation(gpsLocation);
return;
}
if (networkLocation != null) {
locationValue.getCurrentLocation(networkLocation);
return;
}
locationValue.getCurrentLocation(null);
}
}
}
LocationValue.Java
import android.location.Location;
public abstract class LocationValue {
public abstract void getCurrentLocation(Location location);
}
YourActivity.Java
private void getCurrentLocation() {
CustomLocationManager.getCustomLocationManager().getCurrentLocation(this, locationValue);
}
public LocationValue locationValue = new LocationValue() {
@Override
public void getCurrentLocation(Location location) {
// You will get location here if the GPS is enabled
if(location != null) {
Log.d("LOCATION", location.getLatitude() ", " location.getLongitude());
}
}
};
Комментарии:
1. Здесь, когда мы даем разрешение на определение местоположения, а затем, подождав несколько секунд, GPS потребуется время для определения стабильного местоположения, после чего мы получим фактические значения широты и длины.
2. Работает идеально… Хорошее решение
Ответ №5:
Здесь, когда мы даем разрешение на определение местоположения, а затем, подождав несколько секунд, GPS потребуется время для определения стабильного местоположения, после чего мы получим фактические значения широты и длины.
Настройка -> Включить GPS