Класс Android LocationManager не возвращает правильную широту / долготу

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

Я использую класс LocationManager и методы getLatitude / getLongitude для определения местоположения телефона. Мой код выглядит так:

double MyLongitude  = 0;
double MyLatitude   = 0;
Location location   = null;

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 10, new ShowLocation()); 

location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

MyLatitude  = location.getLatitude();
MyLongitude = location.getLongitude();

При тестировании моего приложения на эмуляторе все в порядке: mapView отображает местоположение, которое я зафиксировал (с помощью команды telnet и geo fix), и я могу отправить местоположение по электронной почте. Я получаю такой же результат по телефону друга; вроде все нормально работает.

Проблема в моем телефоне. Я могу отобразить свое местоположение в mapView (маленький синий кружок), но когда я пытаюсь отправить свое местоположение по электронной почте, широта и долгота были установлены на 0.

Вот код для отображения моего местоположения в mapView:

MyLocationOverlay myLocation = new MyLocationOverlay(this, mapView);
myLocation.enableMyLocation();

Я не понимаю, почему мое местоположение работает при отображении, но я не могу получить правильную широту и долготу, хотя это работает на эмуляторе и телефоне моего друга.

Это из-за отсутствия кода или чего-то в этом роде? Это проблема с моим телефоном? Я проверил разрешения, и нужные у меня уже есть:

android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_MOCK_LOCATION

Я также попытался протестировать с помощью LocationManager.NETWORK_PROVIDER вместо LocationManager.GPS_PROVIDER, но получил тот же результат.


person JoMoX909    schedule 06.12.2011    source источник


Ответы (1)


Вы можете переопределить onLoationChanged (Location l) в своем MyLocationOverlay, который будет вызываться всякий раз, когда оверлей получает новое местоположение для отображения вашей позиции, вместо запроса обновлений местоположения и getLastKnownLocation.

Я предполагаю, что getLastKnownLocation возвращает 0, 0, потому что еще не было исправления местоположения.

person FunkTheMonk    schedule 06.12.2011
comment
В классе, в котором отображается mapView, реализован LocationListener, поэтому у меня реализован метод OnLocationChanged. Там я просто использую методы getLatitude и getLongitude из LocationManager. - person JoMoX909; 07.12.2011
comment
Есть ли другой способ определить местоположение на моем телефоне? - person JoMoX909; 07.12.2011
comment
Если вы получаете долготу и широту местоположения в OnLocationChanged, это тоже 0,0? - person FunkTheMonk; 07.12.2011
comment
Привет, наконец-то вроде заработало. Проблема заключалась в моей ошибке: у меня был класс (DisplayMap), в котором отображается карта, реализующий LocationListener. Поэтому я использовал методы onLocationChanged из этого класса. Но проблема заключалась в моем вызове метода requestLocationUpdates: lm.requestLocationUpdates(provider,35000, 10,new ShowLocation()); - person JoMoX909; 07.12.2011
comment
Я использовал другой класс (ShowLocation), реализующий LocationListener, и не использовал его методы. Я изменил свой код и использовал метод onLocationChanged из этого класса, и теперь он, кажется, работает. Не знаю, почему раньше это работало на эмуляторе и телефоне моего друга, но теперь все в порядке;) Большое спасибо за этот совет;) - person JoMoX909; 07.12.2011