代码如下:
package dls.tbox.service;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Vector;
import android.content.Context;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
public abstract class GPSObserver {
public static final String TAG = "TB_GPSObserver";
public static final boolean LOG_ENABLED = true;
public int mOldUseFix = 0;
private Context mContext;
private Workthread wt;
public GPSObserver(Context context) {
mContext = context;
wt = new Workthread();
wt.start();
}
private class Workthread extends Thread implements LocationListener {
private LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
private String gpsProvider = LocationManager.GPS_PROVIDER;
private Handler mHandler;
private boolean paused = true;
GpsStatus mGpsStatus;
GpsStatus.Listener gpsStatusListener;
Vector<GpsSatellite> vSatellite;
private void resumeWork() {
LOGD("resumeWork");
synchronized (this) {
paused = false;
if (locationManager != null) {
locationManager.requestLocationUpdates(gpsProvider, 1, 0, this);
gpsStatusListener = new GpsStatus.Listener()
{
public void onGpsStatusChanged(int event)
{
mGpsStatus = locationManager.getGpsStatus(null);
switch (event)
{
case GpsStatus.GPS_EVENT_FIRST_FIX:
LOGD("GpsTest::onCreate.gpsStatusListener"+ "GPS_EVENT_FIRST_FIX");
mGpsStatus.getTimeToFirstFix();
break;
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
int totalStat = 0;
int usedStat = 0;
Iterable<GpsSatellite> gsiter = mGpsStatus.getSatellites();
Iterator<GpsSatellite> it = gsiter.iterator();
vSatellite = new Vector<GpsSatellite>();
ArrayList<Float> snrarray = new ArrayList<Float>();
while (it.hasNext()) {
GpsSatellite sate = (GpsSatellite)(it.next());
vSatellite.add(sate);
float snr = sate.getSnr();
snrarray.add(snr);
totalStat++;
if (sate.usedInFix()) {
usedStat++;
}
}
if(mOldUseFix != usedStat && usedStat > 0) {
LOGD("+++++++++++gps fix from lost++++++mOldUseFix " + mOldUseFix + " usedStat is " + usedStat);
mOldUseFix = usedStat;
} else if(mOldUseFix != usedStat && usedStat == 0) {
LOGD("++++++++++++gps lost from fix mOldUseFix " + mOldUseFix + " usedStat is " + usedStat);
mOldUseFix = usedStat;
wt.onStatusChanged(null, usedStat, null);
}
snrarray.clear();
break;
case GpsStatus.GPS_EVENT_STARTED:
LOGD("GpsTest::onCreate.gpsStatusListener"+ "getMaxSatellites()=");
break;
case GpsStatus.GPS_EVENT_STOPPED:
LOGD("GpsTest::onCreate.gpsStatusListener"+ "GPS_EVENT_STOPPED");
break;
}
}
};
locationManager.addGpsStatusListener(gpsStatusListener);
}
}
}
private void pause() {
synchronized (this) {
paused = true;
if (locationManager != null) {
locationManager.removeUpdates(this);
locationManager.removeGpsStatusListener(gpsStatusListener);
}
}
}
private void quit() {
synchronized (this) {
if (locationManager != null) {
locationManager.removeUpdates(this);
}
if (mHandler == null) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mHandler.getLooper().quit();
}
}
public void onStatusChanged(String provider, int status, Bundle extras) {
if (!paused) {
onGPSChangeLost(status);
} else {
LOGD("GPSObserver paused..");
}
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
public void onLocationChanged(Location location) {
if (!paused) {
onGPSLocation(location);
} else {
LOGD("GPSObserver paused..");
}
}
@Override
public void run() {
super.run();
synchronized (this) {
Looper.prepare();
mHandler = new Handler();
notify();
}
Looper.loop();
LOGD("GPSObserver workthread quit...");
}
}
public void start() {
wt.resumeWork();
}
public void pause() {
wt.pause();
}
public void stop() {
pause();
wt.quit();
}
public abstract void onGPSLocation(Location l);
public abstract void onGPSChangeLost(int s);
private static void LOGD(String msg) {
if (LOG_ENABLED) {
Log.d(TAG, msg);
}
}
private static void LOGW(String msg) {
if (LOG_ENABLED) {
Log.w(TAG, msg);
}
}
private static void LOGE(String msg) {
if (LOG_ENABLED) {
Log.e(TAG, msg);
}
}
}