Background
I am doing a research involves developing an Android application which collects GNSS measurements and NMEA sentences.
Details
I have managed to receive and log out both GNSS and NMEA data. And it seems to updates every seconds. But now I'm trying to have them updates every 60 seconds instead, by using requestLocationUpdates
with minTime
of 60000 and minDistance
of 1000 or 10000 metres so that it only updates because of the minTime
.
public void measurementsClick(final View view) {
Log.d(LOG_TAG, "measurementsClick");
if (ContextCompat.checkSelfPermission(PubSubActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
Toast.makeText(PubSubActivity.this, "You have already granted this permission!", Toast.LENGTH_SHORT).show();
// Enable GNSS Listener
mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
if (!gnssSensorStatus) {
gnssSensorStatus = true;
mLocationManager.registerGnssMeasurementsCallback(mGnssMeasurementsEventCallback);
mLocationManager.addNmeaListener(this);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 100000, this);
} else {
gnssSensorStatus = false;
mLocationManager.unregisterGnssMeasurementsCallback(mGnssMeasurementsEventCallback);
mLocationManager.removeNmeaListener(this);
mLocationManager.removeUpdates(this);
}
} else {
requestStoragePermission();
}
}
Problem
The updates for NMEA seems to work, as it updates roughly 60 seconds for some types of NMEA sentences. However, GNSS measurements continue to updates every seconds or less. I have tried messing around with different values as well as changing the way I initialized GnssMeasurementsEvent.Callback
, but none of that helps. Hopefully someone with more insight can help me with this.
Relevant Code
public class PubSubActivity extends Activity implements LocationListener, OnNmeaMessageListener {
LocationManager mLocationManager;
GnssMeasurementsEvent.Callback mGnssMeasurementsEventCallback;
public void measurementsClick(final View view) {
Log.d(LOG_TAG, "measurementsClick");
if (ContextCompat.checkSelfPermission(PubSubActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
Toast.makeText(PubSubActivity.this, "You have already granted this permission!", Toast.LENGTH_SHORT).show();
// Enable GNSS Listener
mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
if (!gnssSensorStatus) {
gnssSensorStatus = true;
mLocationManager.registerGnssMeasurementsCallback(mGnssMeasurementsEventCallback);
mLocationManager.addNmeaListener(this);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 100000, this);
} else {
gnssSensorStatus = false;
mLocationManager.unregisterGnssMeasurementsCallback(mGnssMeasurementsEventCallback);
mLocationManager.removeNmeaListener(this);
mLocationManager.removeUpdates(this);
}
} else {
requestStoragePermission();
}
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onNmeaMessage(String message, long timestamp) {
String nmeaStream = String.format(Locale.US, "%s, %d", message.trim(), timestamp);
try {
Log.d(LOG_TAG, nmeaStream);
// filterNmeaType(nmeaStream);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initialize GnssMeasurementEvent callbacks
mGnssMeasurementsEventCallback = new GnssMeasurementsEvent.Callback() {
@Override
public void onGnssMeasurementsReceived(GnssMeasurementsEvent event) {
synchronized (mFileLock) {
GnssClock gnssClock = event.getClock();
for (GnssMeasurement measurement : event.getMeasurements()) {
try {
String result = getGnssMeasurementToString(gnssClock, measurement);
Log.d(LOG_TAG, result);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Log.d(LOG_TAG, "onGnssMeasurementReceived");
}
@Override
public void onStatusChanged(int status) {
Log.d(LOG_TAG, "onStatusChanged");
}
};
}
}