Как я могу проверить текущий статус GPS-приемника? Я уже проверил LocationListener
onStatusChanged
метод, но так или иначе кажется, что это не работает, или просто неправильная возможность.
В основном я просто должен знать, мигает ли значок GPS наверху экрана (не фактическая фиксация) или тело (фиксация доступна).
Хорошо, давайте попробуем комбинацию всех ответов и обновлений и сделаем что-то вроде этого:
ACCESS_FINE_LOCATION
разрешение к вашему манифестуLocationManager
GpsStatus. Слушатель
, который реагирует на GPS_EVENT_SATELLITE_STATUS
LocationManager
с помощью addGpsStatusListener
GPS-приемник может быть чем-то вроде этого:
GpsStatus.Listener listener = new GpsStatus.Listener() {
void onGpsStatusChanged(int event) {
if (event == GPS_EVENT_SATELLITE_STATUS) {
GpsStatus status = mLocManager.getGpsStatus(null);
Iterable<GpsSatellite> sats = status.getSatellites();
// Check number of satellites in list to determine fix state
}
}
}
API немного неясны о том, когда и какая информация о GPS и спутниках дается, но я думаю, что идея будет заключаться в том, чтобы посмотреть, сколько спутников доступно. Если их меньше трех, то исправить это невозможно. Если их больше, то у вас должно быть исправление.
Проба и ошибка - это, вероятно, способ определить, как часто Android сообщает информацию о спутниках, и какую информацию содержит каждый объект GpsSatellite
.
Вы можете попробовать использовать LocationManager.addGpsStatusListener для получения обновленной информации при изменении GPS-статуса. Похоже, что GPS_EVENT_STARTED и GPS_EVENT_STOPPED могут быть тем, что вы ищете.
.Может быть, это лучшая возможность создать задание TimerTask, которое регулярно устанавливает полученное местоположение на определенное значение (нулевое?). Если новое значение получено GPSListener, то оно будет обновлять местоположение с текущими данными.
Я думаю, что это будет рабочим решением.
С помощью LocationManager вы можете получитьLastKnownLocation () после того, как получитеBestProvider (). Это дает вам объект Location, у которого есть методы getAccuracy () в метрах и getTime () в миллисекундах UTC
Достаточно ли это информации?
Или, возможно, вы могли бы перебрать LocationProvider и выяснить, соответствует ли каждый из них критериям (ACCURACY_COARSE)
Вы говорите, что уже пробовали onStatusChanged (), но у меня это работает.
Вот метод, который я использую (я позволяю самому классу обрабатывать onStatusChanged):
private void startLocationTracking() {
final int updateTime = 2000; // ms
final int updateDistance = 10; // meter
final Criteria criteria = new Criteria();
criteria.setCostAllowed(false);
criteria.setAccuracy(Criteria.ACCURACY_FINE);
final String p = locationManager.getBestProvider(criteria, true);
locationManager.requestLocationUpdates(p, updateTime, updateDistance,
this);
}
И я обрабатываю onStatusChanged следующим образом:
void onStatusChanged(final String provider, final int status,
final Bundle extras) {
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
if (location == null || location.getProvider().equals(provider)) {
statusString = "No Service";
location = null;
}
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
if (location == null || location.getProvider().equals(provider)) {
statusString = "no fix";
}
break;
case LocationProvider.AVAILABLE:
statusString = "fix";
break;
}
}
Обратите внимание, что методы onProvider {Dis, En }abled () предназначены для включения и отключение пользователем GPS слежения; не то, что вы ищете.
так много сообщений ...
GpsStatus.Listener gpsListener = new GpsStatus.Listener() {
public void onGpsStatusChanged(int event) {
if( event == GpsStatus.GPS_EVENT_FIRST_FIX){
showMessageDialog("GPS fixed");
}
}
};
добавление этого кода с помощью addGpsListener ... showMessageDialog ... просто показывает стандартное диалоговое окно со строкой
отлично для меня сработало :) большое спасибо: =) (простите за этот пост, пока не могу проголосовать)
После нескольких лет работы с GPS на Windows Mobile я понял, что концепция «потери» исправления GPS может быть субъективной. Чтобы просто послушать, что вам сообщает GPS, добавив NMEAListener и проанализировав предложение, вы узнаете, было ли исправление «действительным» или нет. См. http://www.gpsinformation.org/dale/nmea.htm#GGA . К сожалению, у некоторых GPS-приемников это значение будет колебаться взад и вперед даже во время нормального режима работы в зоне «хорошего исправления».
Итак, другое решение - сравнить время в формате UTC местоположения GPS со временем телефона (преобразованным в UTC). Если между ними есть определенная разница во времени, можно предположить, что вы потеряли координаты GPS.