хорошо, у меня проблема в том, что я пытаюсь получить показания NMEA с устройства Android LG-K530. Для этого я пробовал этот код:
LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 2, new LocationListener() {
@Override
public void onProviderDisabled(String provider) {
showDialog(R.string.playservices_disabled_ttl, R.drawable.ic_action_locate, R.string.playservices_disabled_msg, Settings.ACTION_LOCATION_SOURCE_SETTINGS);
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onLocationChanged(Location location) {
}
});
LM.addNmeaListener(new GpsStatus.NmeaListener() {
public void onNmeaReceived(long timestamp, String nmea) {
// Process NMEA reading
}
});
И что-то вроде этого:
private GpsStatus.NmeaListener nmeaListener = null;
private GpsStatus.Listener gpsStatusListener = null;
private TextView txtGPS_Quality = null;
private TextView txtGPS_Location = null;
private TextView txtGPS_Satellites = null;
private Handler mHandler = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvUbicacion = (TextView) findViewById(R.id.tvUbication);
btnGPS = (Button) findViewById(R.id.button);
btnGPS.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LocationManager locationManager = (LocationManager) MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
System.out.println("test:::" + location);
String temp = convertNmeaRMC(location);
System.out.println("nmea::::" + temp);
tvUbicacion.setText("" + location.getLatitude() + " " + location.getLongitude());
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION);
System.out.println("Provider::::" + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}else{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,0,locationListener);
}
}
});
int permissionCheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
if (permissionCheck == PackageManager.PERMISSION_DENIED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
1);
}
}
registerListener();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
try {
//noinspection JavaReflectionMemberAccess|
Method addNmeaListener =
LocationManager.class.getMethod("addNmeaListener", GpsStatus.NmeaListener.class);
((Method) addNmeaListener).invoke(locationManager, nmeaListener);
} catch (Exception exception) {
// TODO
}
}
private void registerListener() {
locationListener=new LocationListener(){
@Override
public void onLocationChanged(Location loc) {
// TODO Auto-generated method stub
Log.d("GPS-NMEA1", loc.getLatitude() + "," + loc.getLongitude());
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Log.d("GPS-NMEA2", provider + "");
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
Log.d("GPS-NMEA3","OUT_OF_SERVICE");
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.d("GPS-NMEA4"," TEMPORARILY_UNAVAILABLE");
break;
case LocationProvider.AVAILABLE:
Log.d("GPS-NMEA5","" + provider + "");
break;
}
}
};
//
nmeaListener = new GpsStatus.NmeaListener() {
public void onNmeaReceived(long timestamp, String nmea) {
//check nmea's checksum
if (isValidForNmea(nmea)){
nmeaProgress(nmea);
Log.d("GPS-NMEA6", nmea);
}
}
};
}
И ответ, который я получаю от LG, выглядит примерно так:
D/GPS-NMEA6: $GLGSV,3,1,10,74,54,306,,70,28,037,,82,,,,73,76,175,*54
D/GPS-NMEA6: $GLGSV,3,2,10,80,14,142,,65,00,215,,88,,,,81,,,*63
D/GPS-NMEA6: $GLGSV,3,3,10,71,80,071,,72,41,210,*6F
D/GPS-NMEA6: $GPGSV,3,1,11,02,01,300,,04,,,,05,48,251,,06,,,*76
D/GPS-NMEA6: $GPGSV,3,2,11,07,50,133,,08,10,111,,09,32,073,,11,,,*4F
D/GPS-NMEA6: $GPGSV,3,3,11,13,22,237,,15,,,,16,,,*4E
D/GPS-NMEA6: $GPVTG,,T,,M,,N,,K,N*2C
D/GPS-NMEA6: $GPRMC,,V,,,,,,,,,,N*53
D/GPS-NMEA6: $GPGSA,A,1,,,,,,,,,,,,,,,*1E
D/GPS-NMEA6: $GNGSA,A,1,,,,,,,,,,,,,,,*00
D/GPS-NMEA6: $GLGSV,3,1,10,74,54,306,,70,28,037,,82,,,,73,76,175,*54
D/GPS-NMEA6: $GLGSV,3,2,10,80,14,142,,65,00,215,,88,,,,81,,,*63
D/GPS-NMEA6: $GLGSV,3,3,10,71,80,071,,72,41,210,*6F
D/GPS-NMEA6: $GPGSV,3,1,11,02,01,300,,04,,,,05,48,251,,06,,,*76
$GPGSV,3,2,11,07,50,133,,08,10,111,,09,32,073,,11,,,*4F
D/GPS-NMEA6: $GPGSV,3,3,11,13,22,237,,15,,,,16,,,*4E
$GPVTG,,T,,M,,N,,K,N*2C
$GPRMC,,V,,,,,,,,,,N*53
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
D/GPS-NMEA6: $GNGSA,A,1,,,,,,,,,,,,,,,*00
Из того, что я читал, часть $GPRMC
- это то, что мне нужно, но оно пустое.
У меня это $GPRMC,,V,,,,,,,,,,N*53
Вместо этого $GPRMC,14122328.92,A,6602.012343,S,01232.945616,W,000.7,112.7,090720,,,A*50
Я тестировал несколько устройств, LG-K530, Samsung A8 и Moto G8 Plus, и на всех из них я получил одинаковый результат с NMEA. Но в Samsung S7 edge у меня есть правильный кадр NMEA, использующий GPS_PROVIDER
и похожий на второй пример $GPRMC
.
Я тестировал изменение провайдера LocationManager на NETWORK_PROVIDER
и получаю местоположение и используя функцию, я могу создать что-то вроде кадра NMEA, но мне нужен NMEA от GPS любых устройств.
Что-то мне не хватает?