Initial commit: AIS Map Android application

This commit is contained in:
ОС Программист
2025-09-02 15:58:16 +03:00
commit 629b403dd2
78 changed files with 9209 additions and 0 deletions
+148
View File
@@ -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.