2013-05-22 82 views
1

我正在嘗試製作一個Android應用程序,它在特定時間間隔內獲取位置數據,例如: - 5秒,1分鐘等。這裏是我的代碼: -以一定的時間間隔在Android設備上獲取位置數據

  public void onLocationChanged(Location loc) { 
      // TODO Auto-generated method stub 
      if(loc!=null) 
      { 
       //Required Interval 
       tInterval =(minInterval*60*1000) + (secInterval)*1000 - 1000; 

       //The app also supports interval mode 
       RadioButton sel = (RadioButton) findViewById(mode.getCheckedRadioButtonId()); 

       //Code for Manual Functionality 
       if(sel.getText().equals(MANUAL_RADIO)) 
       { 
         Time t = new Time(); 
         t.setToNow(); 
         db.addLocationAtTime(loc, t); 
         Toast.makeText(getApplicationContext(), "Location Added to Database",Toast.LENGTH_SHORT).show();   
         locate.removeUpdates(this); 

         b.setText(MANUAL_BUTTON); 
         d.setEnabled(true); 
       } 

       //Code for Interval functionality 
       else if(sel.getText().equals(INTERVAL_RADIO)) 
       { 
           //count is object of Countdown class which is a Thread object 
           if(count == null) 
           { 
             //t is a Time object 
             t.setToNow(); 
             //SQLiteDatabase object for logging Location with Time 
             db.addLocationAtTime(loc, t); 
             Toast.makeText(getApplicationContext(), "Location Added to Database",Toast.LENGTH_SHORT).show(); 
             count = new CountDown(tInterval); 
             count.start(); 
           } 

           else if(count.getState().toString().equals("TERMINATED")) 
           { 
             t.setToNow(); 
             db.addLocationAtTime(loc, t); 
             Toast.makeText(getApplicationContext(), "Location Added to Database",Toast.LENGTH_SHORT).show(); 
             count = new CountDown(tInterval); 
             count.start();         
           } 

        } 
       } 
      } 

下面是倒計時類的代碼: - 這個類是用來間隔添加到應用程序

public class CountDown extends Thread 
{ 
    long time; 
    public CountDown(long duration) 
    { 
      time = duration; 
    } 

    public void run() 
    { 
        long t1 = System.currentTimeMillis(); 
        long t2 = 0; 
        do 
        { 
         t2 = System.currentTimeMillis();  
        }while(t2 - t1 < time);    
    } 
} 

的問題是,使用上面的代碼我沒有得到準確的時間間隔。我總是得到1秒額外的(因爲我在公式中減去1000),但是這1秒並不總是發生。那麼誰能告訴我我做錯了什麼?

回答

2

LocationManager.requestLocationUpdates,只是通過你的時間間隔參數..

LocationManager mLocationManager = (LocationManager).getSystemService(mActivity.LOCATION_SERVICE); 
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, new GeoUpdateHandler()); 
+0

我只使用GPS提供商,因爲可能沒有正確的網絡覆蓋範圍,它將被使用,其次我需要在使用過程中使用GPS定位,並在requestLocationUpdates()中設置minTime,直到時間已經過去了。 –

+0

你也可以使用「LocationManager.GPS_PROVIDER」 –

+0

我使用過,我需要GPS修復保持ON,因此我將minTime設置爲0,並使用Countdown類添加了一個時間間隔,但我得到了1秒的差異我減去1000,但這種差異並不是每次都發生,因爲我以非均勻間隔獲取位置。 –

1

我覺得這裏你需要使用默認功能,無需使用Timer

NETWORK_PROVIDER

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, networkLocationListener); 

GPS_PROVIDER

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, gpsLocationListener); 

這裏,

minTime(2nd field)  => minimum time interval between location updates, in milliseconds 
minDistance(3rd field) => minimum distance between location updates, in meters 

Documentation

0

我不認爲requestLocationUpdates的minTime參數(...)方法做任何事情。似乎並沒有阻止基於距離的更新以更短的間隔進行,並且它絕對不會導致更新以指定的間隔到達,正如許多人似乎認爲的那樣。我已經嘗試過從Android 2.3.6到4.0.4的設備。

相關問題