generated from Grigo/AndroidTemplate
Initial commit: AIS Map Android application
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
# Решение проблем с NMEA сообщениями в Android
|
||||
|
||||
## Проблема
|
||||
RMC пакеты то приходят, то не приходят, особенно при старте приложения. Это типичная проблема холодного запуска GPS в Android.
|
||||
|
||||
## Причины проблемы
|
||||
|
||||
### 1. Холодный запуск GPS
|
||||
- **GPS модуль включен** ≠ **GPS активен и отправляет данные**
|
||||
- Android может держать GPS в "спящем" режиме для экономии батареи
|
||||
- NMEA сообщения не отправляются без активных слушателей
|
||||
|
||||
### 2. Отсутствие активного запроса локации
|
||||
- `addNmeaListener()` регистрирует слушатель, но не активирует GPS
|
||||
- Нужен активный `requestLocationUpdates()` для "пробуждения" GPS
|
||||
- Без этого NMEA может не приходить часами
|
||||
|
||||
### 3. Проблемы с регистрацией слушателей
|
||||
- Неправильный порядок регистрации
|
||||
- Отсутствие обработки ошибок
|
||||
- Проблемы с версиями Android API
|
||||
|
||||
## Решения
|
||||
|
||||
### 1. Улучшенная регистрация NMEA слушателя
|
||||
```java
|
||||
// Регистрируем с Handler для лучшей производительности
|
||||
locationManager.addNmeaListener(this, mainHandler);
|
||||
|
||||
// Сразу запрашиваем обновления локации для активации GPS
|
||||
requestLocationUpdates();
|
||||
```
|
||||
|
||||
### 2. Агрессивная активация GPS
|
||||
```java
|
||||
// Минимальные интервалы для быстрой активации
|
||||
locationManager.requestLocationUpdates(
|
||||
LocationManager.GPS_PROVIDER,
|
||||
100, // 100мс вместо 1000мс
|
||||
0, // 0 метров
|
||||
locationListener,
|
||||
mainHandler
|
||||
);
|
||||
|
||||
// Дополнительно запрашиваем одиночное обновление
|
||||
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, ...);
|
||||
```
|
||||
|
||||
### 3. Обработка GPS событий
|
||||
```java
|
||||
// При старте GNSS сразу активируем GPS
|
||||
@Override
|
||||
public void onStarted() {
|
||||
requestLocationUpdates(); // Активируем GPS
|
||||
}
|
||||
|
||||
// При первом фиксировании также активируем
|
||||
@Override
|
||||
public void onFirstFix(int ttffMillis) {
|
||||
requestLocationUpdates(); // Дополнительная активация
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Поддержка старых версий Android
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||
// Старый API - GpsStatus.Listener
|
||||
locationManager.addGpsStatusListener(gpsStatusListener);
|
||||
} else {
|
||||
// Новый API - GnssStatus.Callback
|
||||
locationManager.registerGnssStatusCallback(gnssStatusCallback, mainHandler);
|
||||
}
|
||||
```
|
||||
|
||||
## Диагностика
|
||||
|
||||
### Логи для отслеживания
|
||||
```
|
||||
=== ДИАГНОСТИКА GPS ===
|
||||
Доступные провайдеры:
|
||||
gps: включен
|
||||
network: включен
|
||||
passive: включен
|
||||
|
||||
=== РЕГИСТРАЦИЯ СЛУШАТЕЛЕЙ ===
|
||||
✅ NMEA слушатель зарегистрирован
|
||||
✅ GNSS статус callback зарегистрирован (новый API)
|
||||
✅ Location updates запрошены с минимальным интервалом (100мс)
|
||||
✅ Одиночное обновление запрошено
|
||||
|
||||
🎯 NMEA [RMC] получено: $GPRMC,123456,A,...
|
||||
🚢 RMC сообщение получено - GPS активен!
|
||||
```
|
||||
|
||||
### Проверка состояния
|
||||
```java
|
||||
// Детальная информация о GPS
|
||||
String gpsInfo = nmeaListener.getGPSStatusInfo();
|
||||
Log.i(TAG, gpsInfo);
|
||||
|
||||
// Принудительная активация
|
||||
nmeaListener.forceGPSActivation();
|
||||
```
|
||||
|
||||
## Рекомендации
|
||||
|
||||
### 1. При запуске приложения
|
||||
- Сразу регистрируйте NMEA слушатель
|
||||
- Запрашивайте location updates с минимальными интервалами
|
||||
- Обрабатывайте GPS события для дополнительной активации
|
||||
|
||||
### 2. При проблемах с получением NMEA
|
||||
- Проверьте логи на наличие ошибок
|
||||
- Убедитесь, что GPS провайдер включен
|
||||
- Попробуйте принудительную активацию GPS
|
||||
- Проверьте количество видимых спутников
|
||||
|
||||
### 3. Оптимизация
|
||||
- Используйте минимальные интервалы только при необходимости
|
||||
- Обрабатывайте ошибки и повторяйте попытки
|
||||
- Мониторьте состояние GPS через callback'и
|
||||
|
||||
## Тестирование
|
||||
|
||||
Используйте `NMEATestHelper` для диагностики:
|
||||
```java
|
||||
NMEATestHelper testHelper = new NMEATestHelper(context);
|
||||
testHelper.startTest(); // Запускает тест с периодической диагностикой
|
||||
testHelper.forceGPSActivation(); // Принудительная активация
|
||||
testHelper.stopTest(); // Остановка теста
|
||||
```
|
||||
|
||||
## Частые проблемы
|
||||
|
||||
1. **"GPS провайдер отключен"** - включите GPS в настройках
|
||||
2. **"Нет разрешения ACCESS_FINE_LOCATION"** - запросите разрешение
|
||||
3. **"LocationManager недоступен"** - проверьте инициализацию
|
||||
4. **NMEA не приходит** - проверьте логи, попробуйте принудительную активацию
|
||||
|
||||
## Заключение
|
||||
|
||||
Проблема с RMC пакетами решается правильной последовательностью:
|
||||
1. Регистрация NMEA слушателя
|
||||
2. Активация GPS через location updates
|
||||
3. Обработка GPS событий
|
||||
4. Диагностика и мониторинг
|
||||
|
||||
После этих изменений NMEA сообщения должны приходить стабильно, даже при холодном запуске GPS.
|
||||
Reference in New Issue
Block a user