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");
            }
        };
    }
}
0

There are 0 best solutions below