Текущая проблема, которую я получаю, заключается в том, что OnNmeaListener не возвращает правильные данные из NMEA с помощью GpsStatus.Listener, поэтому я попробовал GNSS Status для душевного спокойствия, в итоге он вернул данные gibberi sh , поэтому мне пришлось вернуться к GpsStatus Listener. Я также до использования OnNmeaListener пробовал GpsStatus.NmeaListner и при использовании пытался добавить его в слушатель GpsStatus, он показывался как ошибка и предлагал, чтобы я привел его к OnNmeaListener, когда это будет сделано, и приложение будет создано и все, а затем Выполненный из приложения, он обработал бы sh, а затем не работал бы вообще, и именно поэтому я перешел на OnNmeaListener в первую очередь. Теперь, к его чести, OnNmeaListener работает просто отлично и вообще не обрабатывает sh, но данные, которые он выдает, не совсем точны, я подумал, что, возможно, это может быть какая-то ошибка / ошибка на стороне устройства Затем я приступил к тестированию на двух устройствах с разными уровнями API 25 и 28. На устройстве 25 уровня он просто не дал половину данных, тогда как на устройстве 28 уровня данные полны, но не точны и не корректны.
Это метод, который я сейчас использую:
OnNmeaMessageListener nmeaMessageListener = new OnNmeaMessageListener () {
@Override
public void onNmeaMessage(String nmea , long timestamp) {
if (trackStarted == true && trackPaused == false) {
if (nmea.startsWith ( "$GPGGA" ) || nmea.startsWith ( "$GPRMC" )) {
//Log.d("TrackManagerService","NMEA:" + nmea);
try {
// out.write(nmea.getBytes());
if (continuesMode) {
dataOut.write ( nmea.getBytes () );
bufferedNMEALines++;
if (bufferedNMEALines >= 10) {
flushContinuesTrack ();
//dataOut.reset();
bufferedNMEALines = 0;
}
} else {
outCompressed.write ( nmea.getBytes () );
}
// Log.d("TrackManagerService","NMEA:" + nmea);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
if (nmea.startsWith ( "$GPGGA" )) {
String[] nmeaSplit = nmea.split ( "," );
if (nmeaSplit.length > 10) {
if (nmeaSplit[9].length () > 0) {
try {
mslAltitude = Float.parseFloat ( nmeaSplit[9] );
} catch (NumberFormatException ex) {
mslAltitude = 0;
}
} else {
mslAltitude = 0.0f;
}
}
}
}
//if (markStarted && hasFix() && nmea.startsWith("$GPGGA")) {
if (markStarted && hasFix () && nmea.startsWith ( "$GPRMC" )) {
markProgress++;
trackListener.onMarkProgress ( markProgress );
if (markProgress >= markMax) {
stopMark ();
}
}
}
}
};
И это вывод, который он выдает при вызове:
$Start,082719,260220;
$GPGGA,082721.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*44
$GPRMC,082721.42,V,2654.2979,N,08056.6065,E,0.000,0.000,260220,E,N*01
$GPGGA,082722.41,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*44
$GPRMC,082722.41,V,2654.2979,N,08056.6065,E,0.000,0.000,260220,E,N*01
$End,082802,260220;
$Start,082804,260220;
$GPGGA,082837.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*4C
$GPRMC,082837.42,V,2654.2979,N,08056.6065,E,0.000,0.000,260220,E,N*09
$GPGGA,082838.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*43
$GPGGA,082840.42,2654.2979,N,08056.6065,E,0,100.000,0.000,M,M,0,*4C
$End,082841,260220;
$Start,082921,260220;
$GPGGA,082923.40,2654.2982,N,08056.6059,E,0,100.000,0.000,M,M,0,*41
$GPRMC,082923.40,V,2654.2982,N,08056.6059,E,0.000,0.000,260220,E,N*04
$GPGGA,082924.40,2654.2982,N,08056.6059,E,0,100.000,0.000,M,M,0,*46
$GPRMC,082945.40,V,2654.2982,N,08056.6059,E,0.000,0.000,260220,E,N*04
$End,082945,260220;
И это вывод при вызове с использованием прослушивателя GNSS:
$ Start, 080450,260220; ���������������������������� 101
Есть какой-нибудь способ заставить это работать?
[РЕДАКТИРОВАТЬ]
Это ответ от * Устройство 1030 *, которое было принято сервером:
$Start,150403,250220;
$GPGGA,150403.69,2654.29986954,N,8056.60312653,E,1,00,0.0,0.0,0,0.0,0,0.0,0000*42;
$GPRMC,150743.99,A,2654.29986954,N,8056.60260391,E,0.0,0.0,250220,0.0,E,A*5;
$GPRMC,150844.26,A,2654.29986954,N,8056.60260391,E,0.0,0.0,250220,0.0,E,A*9;
$GPRMC,150937.91,A,2654.30012894,N,8056.60312653,E,0.0,0.0,250220,0.0,E,A*e;
$GPGGA,150945.04,2654.30429840,N,8056.60781097,E,1,00,0.0,0.0,0,0.0,0000*42;
$GPRMC,150952.01,A,2654.29921722,N,8056.60364532,E,0.0,0.0,250220,0.0,E,A*2;
$End,150953,250220;
$GPGGA,150953.00,2654.29921722,N,8056.60364532,E,1,00,0.0,0.0,0,0.0,0000*42;
$GPRMC,150953.00,A,2654.29921722,N,8056.60364532,E,0.0,0.0,250220,0.0,E,A*2;
Теперь у меня нет ни малейшего представления, как это работает на устройстве iOS, (мой старший работал над этим и дал мне эти данные) , но каким-то образом это сработало, и когда тот же лог c был реализован на Android и данные были загружены на сервер, он не принял бы его, тогда как когда iOS с данными манипулировали любым способом (удаляя строки, надстрочные знаки, удаляя точки с запятой, запятые и т. д. c.), это все равно будет работать.