【问题标题】:Getting location data on an Android device in certain intervals以特定时间间隔在 Android 设备上获取位置数据
【发布时间】:2013-05-22 04:49:57
【问题描述】:

我正在尝试制作一个 Android 应用程序,它以特定的时间间隔获取位置数据,例如:- 5 秒、1 分钟等。这是我的代码:-

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

                  }
              }
            }

这是 Countdown 类的代码:- 该类用于给应用添加区间

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 秒并不总是发生。那么谁能告诉我我做错了什么?

【问题讨论】:

    标签: android gps


    【解决方案1】:

    查看LocationManager.requestLocationUpdates,只需在参数中传递您的时间间隔..

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

    【讨论】:

    • 我只使用 GPS 提供商,因为可能没有适当的网络覆盖范围,其次我需要在使用期间进行 GPS 修复并在 requestLocationUpdates() 中设置 minTime 删除修复直到时间过去。
    • 你也可以使用“LocationManager.GPS_PROVIDER”
    • 我用过,我需要 GPS 定位保持开启,因此我将 minTime 设置为 0 并使用 Countdown 类添加了一个间隔,但我得到了 1 秒的差异,因此我减去 1000,但这种差异并非每次都发生,因为我以非均匀的间隔获取位置。
    • 当您的位置发生变化时,时间间隔将起作用...我希望您留在同一个地方,这就是您的方法不调用的原因...
    • 当我将时间间隔设置为 5000 时,GPS 定位将在获取位置后的 5000 毫秒内关闭。我正在浪费时间再次获得我不想做的修复。因此,我将间隔设置为 0,以便设备进行修复并保持由 Countdown 对象确定的指定间隔记录位置,直到我按下应用程序中的停止按钮
    【解决方案2】:

    我认为这里你需要使用默认功能,不需要使用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

    【讨论】:

      【解决方案3】:

      我不认为 requestLocationUpdates(...) 方法的 minTime 参数有任何作用。它似乎并不能阻止基于距离的更新以更短的时间间隔进行,而且它绝对不会像许多人认为的那样导致以指定的时间间隔进行更新。我已经在 Android 2.3.6 到 4.0.4 的设备上尝试过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        • 2018-05-03
        相关资源
        最近更新 更多