2011-10-12 21 views
8

我正在寫一個應用程序,每10分鐘記錄一次新的GPS位置。如何在Android中定期查找GPS位置

我試過位置輪詢器,將位置監聽器放在一個服務中,並將位置監聽器放在一個活動中,但這些方法都不適用於我。

我需要一種方法,在我開始記錄我的位置數據前2分鐘打開gps位置監聽器(以使gps有足夠的時間來查找位置或確定沒有信號)。我一直在使用一個警報,在我調用updatelocation類之前2分鐘調用我的gpsActivity。然後,我的updatelocation類使用gpsActivity的位置管理器並從中提取位置。

理論上這應該工作,但是當我把它放在我的手機上,我總是得到壞數據(精度過低或無信號的話)

如果有人能幫助我,我將非常感謝。

感謝

報警更新位置前調用這個類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 { 
     } 
    } 
} 
+0

http://tinyurl.com/942lhyf試試這個工作演示:) – 2012-09-25 09:15:17

回答

4

使用接收器,服務於一體。爲此,您可以在this link中找到完整的樣本。裏面有一個聽衆。聽衆可以在你的活動中使用,注意到一個新的位置已經爲你準備好了。

+0

http://stackoverflow.com/questions/2775628/android-how-to-periodically-send-location-to-a-server似乎不同意。它建議報警管理員 – Mawg