2013-05-22 107 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的设备。

相关问题