我正在编写一个应用程序,每十分钟就会记录一个新的gps位置。
我尝试了位置查询器,将位置监听器放在服务中,并将位置监听器放在一个活动中,但这些方法都不适合我。
我需要一种方法在我开始记录我的位置数据前2分钟打开gps位置监听器(为gps提供足够的时间来查找位置或确定没有信号)。我一直在使用在我调用updatelocation类之前2分钟调用gpsActivity的警报。然后我的updatelocation类接受gpsActivity的locationmanager并从中提取一个位置。
从理论上说这应该可行,但是当我把它放在手机上时,我总是得到不好的数据(准确度太低或根本没有信号)
如果有人可以帮助我,我将非常感激。
由于
闹钟在更新位置前2分钟调用此课程
public class GPSActivity extends Activity {
public static LocationListener loc_listener = null;
public static LocationManager locationManager = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
getGPS();
}
public static void getGPS() {
if (loc_listener == null) {
loc_listener = new LocationListener() {
@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 onLocationChanged(Location location) {}
};
}
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 0, 0, loc_listener);
}
public static void killGPS() {
if (locationManager != null && loc_listener != null) {
locationManager.removeUpdates(loc_listener);
}
}
}
然后两分钟后,这项服务被称为
public class UpdateLocation extends IntentService {
public static final String id = "";
public static int retryCount = 0;
int notificationID = 1;
// gets the location manager from the GPSActivity
LocationManager locationManager = GPSActivity.locationManager;
@Override
public void onDestroy() {
super.onDestroy();
}
public UpdateLocation() {
super("UpdateLocation");
}
@Override
protected void onHandleIntent(Intent intent) {
locationManager = GPSActivity.locationManager;
SharedPreferences prefs = getSharedPreferences("Settings", 0);
final String id = prefs.getString("ID", "");
HttpParams httpParams = new BasicHttpParams();
// 30seconds and it stops
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
HttpConnectionParams.setSoTimeout(httpParams, 30000);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
HttpPost httpost = new HttpPost(
"http://iphone-radar.com/gps/gps_locations");
JSONObject holder = new JSONObject();
try {
holder.put("id", id);
Location location = getLocation();
if (location != null && (location.getAccuracy() < 25)) {
retryCount = 0;
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(
"hh:mmaa MM/dd/yyyy");
holder.put("time", sdf.format(c.getTime()));
holder.put("time_since_epoch",
System.currentTimeMillis() / 1000);
holder.put("lat", location.getLatitude());
holder.put("lon", location.getLongitude());
StringEntity se = new StringEntity(holder.toString());
httpost.setEntity(se);
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
ResponseHandler responseHandler = new BasicResponseHandler();
String response = httpclient.execute(httpost,
responseHandler);
org.json.JSONObject obj;
obj = new org.json.JSONObject(response);
SimpleDateFormat sdf2 = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ssaa");
addHistory(
sdf2.format(c.getTime()),
"Background GPS",
"Latitude: "
+ String.format("%.6g%n",
location.getLatitude())
+ "\n"
+ "Longitude: "
+ String.format("%.6g%n",
location.getLongitude()));
SharedPreferences.Editor editor = prefs.edit();
editor.putString("LastUpdatedTime", sdf.format(c.getTime()));
editor.commit();
Intent setAlarm = new Intent(UpdateLocation.this,
UpdateLocation.class);
PendingIntent pendingIntent = PendingIntent.getService(
UpdateLocation.this, 0, setAlarm, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
int UPDATE_TIME = prefs.getInt("Update_time", 10);
calendar.add(Calendar.MINUTE, UPDATE_TIME);
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(), pendingIntent);
// sets an alarm for the next time we need to record a
// location
GPSActivity.killGPS();
// turns off the gps location listener
Intent setAlarm2 = new Intent(UpdateLocation.this,
GPSActivity.class);
PendingIntent pendingIntent2 = PendingIntent.getService(
UpdateLocation.this, 0, setAlarm2, 0);
Calendar calendar2 = Calendar.getInstance();
calendar2.add(Calendar.MINUTE, UPDATE_TIME - 2);
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar2.getTimeInMillis(), pendingIntent2);
// sets an alarm to turn on the gpsActivity 2mins before the
// next time updatelocation needs to record some data
}
} finally {
}
}
}