2011-10-12 11 views
8

Piszę aplikację, która zapisuje nową lokalizację GPS co dziesięć minut na kropce.Jak okresowo znajdować lokalizację GPS w Androidzie

Próbowałem lokatorów, umieszczając odbiornik lokalizacji w usłudze i umieszczając odbiornik lokalizacji w działaniu, ale żadna z tych metod nie działa dla mnie.

Potrzebuję metody włączania odbiornika lokalizacji GPS na 2 minuty przed rozpoczęciem nagrywania danych o mojej lokalizacji (aby dać GPSowi wystarczającą ilość czasu na znalezienie lokalizacji lub stwierdzenie, że nie ma sygnału). Robiłem to za pomocą alarmu, który wywołuje mój gpsActivity 2 minuty, zanim zadzwonię do mojej klasy updatelocation. Moja klasa updatelocation pobiera menedżer lokalizacji gpsActivity i wyodrębnia z niego lokalizację.

W teorii to powinno działać, ale kiedy kładę go na moim telefonie zawsze dotrzesz złe dane (dokładność jest zbyt niska lub brak sygnału w ogóle)

Jeśli ktoś mógłby mi pomóc byłbym bardzo wdzięczny.

Dzięki

Alarm nazywa ta klasa 2 minut przed umieszczeniem aktualizacji

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

następnie dwie minuty później ta usługa nazywa

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 Wypróbuj tę działającą wersję demonstracyjną :) –

Odpowiedz

4

Wykorzystanie odbiornika i usług razem. W tym celu można znaleźć pełną próbkę w this link. Jest w tym słuchacz. Listener można wykorzystać w swojej działalności, aby zauważyć, że nowa lokalizacja jest już gotowa.

+0

http://stackoverflow.com/questions/2775628/android-how-to-periodically-send-location-to-a-server wydaje się być nie zgadzać się. Zaleca menedżera alarmów – Mawg

Powiązane problemy