2011-10-12 11 views
8

私は10分ごとに新しいGPSの場所をドットに記録するアプリを書いています。定期的にAndroidでgpsの場所を見つける方法

私はロケーションポーラーを試し、ロケーションリスナーをサービスに入れ、ロケーションリスナーをアクティビティに入れましたが、これらのメソッドはどれも私には役に立たなかった。

gpsロケーションリスナーをオンにして2分後に私のロケーションデータの記録を開始する方法が必要です(場所を見つけるのに十分な時間を与えたり、信号がないと判断するのに十分な時間を与えます)。私は私のupdatelocationクラスを呼び出す2分前に私のgpsActivityを呼び出すアラームを使用してこれを行ってきました。その後、私のupdatelocationクラスはgpsActivityのlocationManagerを取得し、そこからロケーションを抽出します。

これは動作するはずです理論的には

が、私は自分の携帯電話の上に置いたとき、私はいつもの悪いデータを取得する(精度が低すぎるか、全く信号である)

誰かが、私は非常に感謝される私を助けることができれば。更新場所

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

はその後、2分後にこのサービスが一緒に

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このデモを試してみてください:) –

答えて

4

使用レシーバーとサービスと呼ばれる前に

おかげ

アラームは、このクラス2分を呼び出します。この目的のために、完全なサンプルをthis linkに見つけることができます。そこにリスナーがいます。リスナーは、新しい場所があなたのために用意されていることに注意するために、あなたの活動に使用することができます。

+0

http://stackoverflow.com/questions/2775628/android-how-to-periodically-send-location-to-a-server同意しない。アラームマネージャを推奨します – Mawg

関連する問題