循环获取GPS数据

时间:2014-09-27 04:02:13

标签: java android api gps geolocation

我正在实现使用GPS数据的Android应用程序(尤其是GPS时间)。现在我在“GPSReader”类中使用接口“LocationListner”,它似乎只在协调发生变化时“收听”GPS数据。

我也试图将GPS数据存储在公共类“Common”中的全局​​变量“gpsTime”中,并使用它来自“SensorReader”类。在本课程中,我尝试循环获取GPS数据,如100 Hz,但是,正如我之前提到的,纬度,经度和GPS时间等数据有时不会改变,因为协调没有变化。我想使用GPS时间作为参考时间,所以想要周期性地获得它,例如100赫兹。我认为“LocationListner”是“被动的”,所以程序是否有任何“积极”的方式自行循环获取GPS数据?

提前非常感谢你。

这是“GPSReader”类,其中包含“LocationListner”。

package com.crowdsourcing.usgs;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Binder;
import android.provider.Settings;
import android.widget.Toast;
import java.util.Random;

import Util.DateFormatter;


/**
 * Created by TomokazuY on 9/14/2014.
 */
public class GPSReader extends Service implements LocationListener, GpsStatus.Listener, GpsStatus.NmeaListener {

private LocationManager locationManager;
Location location;
private String provider;
//gpsLog, gpsTime will be passed to SensorReader
public String gpsLog;
private long gpsTime;
private double latitude;
private double longitude;
private double altitude;
private float bearing;
private float accuracy;
private String gpsProvider;
public String nmea;

private long lastUpdate = 0;
//For global variable 
Common common;

public void onGpsStatusChanged(int event) {
}


public void onNmeaReceived(long timestamp, String nmea)
{
    this.nmea = "NMEA Sentence: "+ nmea;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //For global variable
    common=((Common)getApplicationContext());

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the location provider -> use default
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setCostAllowed(false);

    provider = locationManager.getBestProvider(criteria, false);
    // the last known location of this provider
    location = locationManager.getLastKnownLocation(provider);
    common.initGPSTime = location.getTime();

    // Initialize the location fields
    if (location != null) {
        this.onLocationChanged(location);
    } else {
        intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startService(intent);
    }
    // location updates: at least 1 meter and 200 milli secs change
    // Both set to zero, which is the most aggressive setting.
    // You’ll get a location update if any change in location is detected at any time.
    // This setting can result in your app accessing the GPS provider as often as 50 –
    //This can drain a fully charge Samsung Galaxy S III in less than 3 hours.
    locationManager.requestLocationUpdates(provider, 0,0, this);

    locationManager.addNmeaListener(this);

    return START_STICKY;

}
@Override
public void onLocationChanged(Location location) {
    // Called when a new location is found by the network location provider.
    makeUseOfNewLocation(location);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}
@Override
public void onProviderEnabled(String s) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();


}
@Override
public void onProviderDisabled(String s) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();
}

public void makeUseOfNewLocation(Location loc) {
    latitude = loc.getLatitude();
    longitude = loc.getLongitude();
    altitude = loc.getAltitude();
    bearing = loc.getBearing();
    accuracy = loc.getAccuracy();
    gpsProvider = loc.getProvider();

    long curTime = System.currentTimeMillis();
    long currentGpsTime = loc.getTime();
    String currentGpsTimeString;
    common.gpsTime = currentGpsTime;
    currentGpsTimeString = DateFormatter.formatTimeStampM(common.gpsTime);

    common.gpsLog = ",lat:," + latitude + ",long:," + longitude + ", alt:," + altitude
            + ", accuracy:," + accuracy + ", provider:,"+ gpsProvider

            + ", GPSTime:," + DateFormatter.formatTimeStampM(common.gpsTime)
            + ", ForGraph:," + curTime + "," + currentGpsTime
            + ", NMEA:," + nmea;
}

@Override
public void onDestroy() {

    if(locationManager != null){
        locationManager.removeUpdates(GPSReader.this);
    }
}

// Binder given to clients
private final IBinder mBinder = new LocalBinder();
// Random number generator
private final Random mGenerator = new Random();

/**
 * Class used for the client Binder.  Because we know this service always
 * runs in the same process as its clients, we don't need to deal with IPC.
 */
public class LocalBinder extends Binder {
    GPSReader getService() {
        // Return this instance of LocalService so clients can call public methods
        return GPSReader.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

/** method for clients */
public long getGpsTime() {
    return this.gpsTime;
}

//The function for gpsLog to be passed to SensorReader
public String getGpsLog() {
    return gpsLog;
}

}

此处还有“SensorReader”类循环循环(有分配采样率的部分)。

package com.crowdsourcing.usgs;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.widget.Toast;

import Util.DateFormatter;
import Util.FileCreator;

/**
 * Created by SusanaLauH on 9/14/2014.
 */
public class SensorReader extends Service implements SensorEventListener{

    //private final IBinder mBinder = new LocalBinder();
    private SensorManager mSensorManager;
    private Sensor accelerometerSensor, gyroscopeSensor, uncalGyroscopeSensor,
                   temperatureSensor, gravitySensor, lightSensor,
                   linearAccSensor, magnetSensor, uncalMagnetSensor,
                   airPressureSensor, humiditySensor, proximitySensor;

    Boolean test;
    Boolean isAccelerometer, isGyroscope, isUncalGyroscope, isMagnet, isUncalMagnet, isGravity,
            isLinearAcceleration, isTemperature, isProximity, isHumidity, isPressure, isLight;

    Boolean is1Hz, is5Hz, is50Hz, is100Hz;

    float xA, yA, zA = 0;// Accelerometer
    float xGy, yGy, zGy = 0; //Gyroscope
    float xGyu, yGyu, zGyu = 0; //Uncalibrated gyroscope
    float xGr, yGr, zGr; //Gravity
    float xLA, yLA, zLA;  //Linear Acceleration
    float xMg, yMg, zMg; //Magnetic Field
    float xMgu, yMgu, zMgu; //Uncalibrated magnetic field
    float temperature, airPressure, humidity, proximity, light;

    private long lastUpdate = 0;
    //private long lastUpdate = System.currentTimeMillis();

    int samplingRate = 1000; //Sampling rate = 1 Hz (units are in milliseconds)
    GPSReader gpsReader = new GPSReader();

    //Global variable
    Common common;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Starting reading sensors", Toast.LENGTH_SHORT).show();

        //Global variable
        common=((Common)getApplicationContext());

        common.initSysTime = System.currentTimeMillis();

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        gyroscopeSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        uncalGyroscopeSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);
        temperatureSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
        gravitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
        lightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
        linearAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
        magnetSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        uncalMagnetSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);
        airPressureSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
        humiditySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY);
        proximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

        //Using DELAY_FASTEST, the sensor will try to sensor the data as fast as possible.
        //Use more system resources
        mSensorManager.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, gyroscopeSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, uncalGyroscopeSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, temperatureSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, gravitySensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, lightSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, linearAccSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, magnetSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, uncalMagnetSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, airPressureSensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, humiditySensor, SensorManager.SENSOR_DELAY_FASTEST);
        mSensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_FASTEST);


       isAccelerometer = intent.getExtras().getBoolean("Accelerometer");
       isGyroscope =  intent.getExtras().getBoolean("Gyroscope");
       isUncalGyroscope =  intent.getExtras().getBoolean("UncalGyroscope");
       isGravity =  intent.getExtras().getBoolean("Gravity");
       isMagnet =  intent.getExtras().getBoolean("Magnet");
       isUncalMagnet =  intent.getExtras().getBoolean("UncalMagnet");
       isLinearAcceleration =  intent.getExtras().getBoolean("LinearAcceleration");
       isLight =  intent.getExtras().getBoolean(":Light");
       isProximity =  intent.getExtras().getBoolean("Proximity");
       isPressure =  intent.getExtras().getBoolean("Pressure");
       isTemperature =  intent.getExtras().getBoolean("Temperature");
       isHumidity = intent.getExtras().getBoolean("Humidity");

       is1Hz = intent.getExtras().getBoolean("1Hz");
       is5Hz = intent.getExtras().getBoolean("5Hz");
       is50Hz = intent.getExtras().getBoolean("50Hz");
       is100Hz = intent.getExtras().getBoolean("100Hz");


        //Toast.makeText(this, "Frequency 1: " + is1Hz, Toast.LENGTH_SHORT).show();
        //Toast.makeText(this, "Frequency 5: " + is5Hz, Toast.LENGTH_SHORT).show();
        //Toast.makeText(this, "Frequency 100: " + is100Hz, Toast.LENGTH_SHORT).show();

        if (is1Hz == true){
            samplingRate = 1000;
        }

        if (is5Hz == true){
            samplingRate = 200;
        }

        if (is50Hz == true){
            samplingRate = 20;
        }

        if (is100Hz == true) {//100 Hz
            //samplingRate = 10;
            samplingRate = 5;

        }
        //Detecting accelerometer
        if (accelerometerSensor != null) {
            Toast.makeText(this, "Accelerometer detected with MaxRange of: " + accelerometerSensor.getMaximumRange()
                                   + " and resolution of: " + accelerometerSensor.getResolution()
                                   + " and minDelay of: " + accelerometerSensor.getMinDelay(),
                                   Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No accelerometer detected", Toast.LENGTH_SHORT).show();
        }

        //Detecting gyroscope
        if (gyroscopeSensor != null) {
            Toast.makeText(this, "Gyroscope detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No gyroscope detected", Toast.LENGTH_SHORT).show();
        }

        //Detecting temperature sensor
        if (temperatureSensor != null) {
            Toast.makeText(this, "Temperature Sensor detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No temperature sensor detected", Toast.LENGTH_SHORT).show();
        }

      //Detecting gravity sensor
        if (gravitySensor != null) {
            Toast.makeText(this, "Gravity Sensor detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No gravity sensor detected", Toast.LENGTH_SHORT).show();
        }

      //Detecting light sensor
        if (lightSensor != null) {
            Toast.makeText(this, "Light Sensor detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No light sensor detected", Toast.LENGTH_SHORT).show();
        }

       //Detecting magnetic field detector
        if (magnetSensor != null) {
            Toast.makeText(this, "Magnetic field Sensor detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No magnetic field sensor detected", Toast.LENGTH_SHORT).show();
        }

       //Detecting air pressure sensor
        if (airPressureSensor != null) {
            Toast.makeText(this, "Air pressure Sensor detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No Air pressure sensor detected", Toast.LENGTH_SHORT).show();
        }

        //Detecting humidity sensor
        if (humiditySensor != null) {
            Toast.makeText(this, "Humidity Sensor detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No humidity sensor detected", Toast.LENGTH_SHORT).show();
        }

        //Detecting proximity sensor
        if (proximitySensor != null) {
            Toast.makeText(this, "Proximity Sensor detected", Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this, "No proximity sensor detected", Toast.LENGTH_SHORT).show();
        }

        return START_STICKY;
    }


    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Sensor mSensor = sensorEvent.sensor;

        //Accelerometer
        if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER && isAccelerometer == true) {
            xA = sensorEvent.values[0];
            yA = sensorEvent.values[1];
            zA = sensorEvent.values[2];
        }

        //Gyroscope
        if (mSensor.getType() == Sensor.TYPE_GYROSCOPE && isGyroscope == true) {
            xGy = sensorEvent.values[0];
            yGy = sensorEvent.values[1];
            zGy = sensorEvent.values[2];
        }

        //-Uncalibrated Gyroscope
        //Uncalibrated sensors provide more raw results and may include some bias,
        // but their measurements contain fewer jumps from corrections applied through calibration
        //Data is without drift compensation
        if (mSensor.getType() == Sensor.TYPE_GYROSCOPE_UNCALIBRATED && isUncalGyroscope == true) {
            xGyu = sensorEvent.values[0];
            yGyu = sensorEvent.values[1];
            zGyu = sensorEvent.values[2];
        }

        //Temperature
        if (mSensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE && isTemperature == true) {
            temperature = sensorEvent.values[0];
        }

        //Gravity
        if (mSensor.getType() == Sensor.TYPE_GRAVITY && isGravity == true) {
            xGr = sensorEvent.values[0];
            yGr = sensorEvent.values[1];
            zGr = sensorEvent.values[2];
         }

         //Light
        if (mSensor.getType() == Sensor.TYPE_LIGHT && isLight == true) {
            light = sensorEvent.values[0];
        }

        //Linear Acceleration
        if (mSensor.getType() == Sensor.TYPE_LINEAR_ACCELERATION && isLinearAcceleration == true) {
            xLA = sensorEvent.values[0];
            yLA = sensorEvent.values[1];
            zLA = sensorEvent.values[2];
        }

        //Magnetic Field
        if (mSensor.getType() == Sensor.TYPE_MAGNETIC_FIELD && isMagnet == true) {
            xMg = sensorEvent.values[0];
            yMg = sensorEvent.values[1];
            zMg = sensorEvent.values[2];
        }
        //Uncalibrated Magnetic Field
        if (mSensor.getType() == Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED && isUncalMagnet == true) {
            xMgu = sensorEvent.values[0];
            yMgu = sensorEvent.values[1];
            zMgu = sensorEvent.values[2];
        }

        //Air Pressure
        if (mSensor.getType() == Sensor.TYPE_PRESSURE && isPressure == true) {
            airPressure = sensorEvent.values[0];
        }

        //Humidity
        if (mSensor.getType() == Sensor.TYPE_RELATIVE_HUMIDITY && isHumidity ==true) {
            humidity = sensorEvent.values[0];
        }

        //Proximity
        if (mSensor.getType() == Sensor.TYPE_PROXIMITY && isProximity == true) {
            proximity = sensorEvent.values[0];
        }

        //Logging data
        long curTime = System.currentTimeMillis();
        //long curTime = gpsReader.getGpsTime();
        //long gpsTime= common.gpsTime;
        //Get the GPS time from GPSReader
        String logTime = DateFormatter.formatTimeStampM(curTime);
        if ((curTime - lastUpdate) > samplingRate) {
            lastUpdate = curTime;
            String log = logTime;

                if (isAccelerometer == true){
                    log = log + ",Acc:," + xA + "," + yA + "," + zA;
                }

                if (isGyroscope == true) {
                    log = log + ",Gyro:," + xGy + "," + yGy + "," + zGy;
                }

                if (isUncalGyroscope == true) {
                    log = log + ",UncGyro:," + xGyu + "," + yGyu + "," + zGyu;
                }

                if (isGravity == true) {
                    log = log + ",Gravity:," + xGr + "," + yGr + "," + zGr;
                }

                if (isMagnet == true) {
                    log = log  + ",Mag:," + xMg + "," + yMg + "," + zMg;
                }

                if (isUncalMagnet == true){
                    log = log  + ",UncMag:," + xMgu + "," + yMgu + "," + zMgu;
                }

                if (isLinearAcceleration == true) {
                    log = log + ",Linear acc:," + xLA + "," + yLA + "," + zLA;
                }

                if (isLight == true){
                    log = log  + ",Light:," + light;
                }

                if (isTemperature == true) {
                    log = log + ",Temp:," + temperature;
                }

                if (isProximity == true){
                    log = log + ",Proximity:," + proximity;
                }

                if (isPressure == true){
                    log = log + ",AirPressure:," + airPressure;
                }

                if (isHumidity == true){
                    log = log + ",Humidity:," + humidity;

                }
                   // + ", xA:" + xA + ", yA:" + yA + ", zA:" + zA
                   //+ ", xG:" + xGy + ", yG:" + yGy + ", zG: " + zGy + ", "
                   // + ", xGu:" + xGyu + ", yGu:" + yGyu + ", zGu: " + zGyu + ", "
                    //+ ",Acc:," + xA + "," + yA + "," + zA
                   // + ",Gyro:," + xGy + "," + yGy + "," + zGy
                   //+ ",UncGyro:," + xGyu + "," + yGyu + "," + zGyu
                    //+ ",Temp:," + temperature
                    //+ ",Gravity:," + xGr + "," + yGr + "," + zGr
                    //+ ",Light:," + xA + "," + yA + "," + zA
                    //+ ",Linear acc:," + xLA + "," + yLA + "," + zLA
                    //+ ",Mag:," + xMg + "," + yMg + "," + zMg
                    //+ ",UncMag:," + xMgu + "," + yMgu + "," + zMgu
                    //+ ",Air:," + airPressure
                    //+ ",Humidity:," + humidity
                   // + ",Proximity:," + proximity

           // log = log + gpsReader.getGpsLog();

                    //+ common.gpsTime;
                 log = log   + common.gpsLog;


            FileCreator file = new FileCreator();
            file.write("Logs", log);
        }

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
    //Do nothing
    }

    // To provide binding for a service, you must implement the onBind() callback method.
    // This method returns an IBinder object that defines the programming interface that
    // clients can use to interact with the service.
    @Override
    public IBinder onBind(Intent intent) {
        //return mBinder;
        return null;
    }
    @Override
    public void onDestroy() {
        //Toast.makeText(this, "Service done", Toast.LENGTH_SHORT).show();
        mSensorManager.unregisterListener(this);
    }

 }

全局变量的“Common”类

package com.crowdsourcing.usgs;
import android.app.Application;


/**
 * Created by tomokazy on 9/20/14.
 */
public class Common extends Application{
    // Global
    long initSysTime;
    long initGPSTime;
    long gpsTime;
    String gpsLog;
    public void init(){
        gpsTime = 0;
        gpsLog = "";
    }

}

0 个答案:

没有答案