Java 以精确的时间间隔获取GPS位置

Java 以精确的时间间隔获取GPS位置,java,android,timer,gps,refresh,Java,Android,Timer,Gps,Refresh,我试图在不同的间隔范围内获得尽可能精确的gps位置,我几乎没有外部gps,10hz、5hz和1hz LocationManager locationManager = (LocationManager) car.this.getSystemService(car.this.LOCATION_SERVICE); LocationListener locationListener = new LocationListener() { public

我试图在不同的间隔范围内获得尽可能精确的gps位置,我几乎没有外部gps,10hz、5hz和1hz

    LocationManager locationManager = (LocationManager) 
car.this.getSystemService(car.this.LOCATION_SERVICE);

    LocationListener locationListener = new LocationListener() {
                public void onLocationChanged(Location location) {
                    // Called when a new location is found

                }
                public void onStatusChanged(String provider, int status, Bundle extras) {}

                public void onProviderEnabled(String provider) {}

                public void onProviderDisabled(String provider) {}
            };

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, 
locationListener);
通过这种方式,我可以在匀速行驶时获得这样的日志更新

10hz GPS

81ms  new position
79ms  new position
88ms  new position
96ms  new position
196ms new positon
60ms  new positon
256ms new position
70ms  new position

5 hz GPS

187ms new...
189ms ..
275ms ..
140ms ..
180ms ..
220ms ..
所以我认为onStatusChanged最初比标称频率快,但随后饱和并导致大的跳跃

如果我使用计时器,它工作得很好,我每100毫秒(200或1000)获得一个位置,但计时器每10秒大约会关闭100毫秒

编辑:为了澄清,我想得到一个精确(或接近)100ms、200ms或1000ms的位置

**更新12-04-13

在重做代码以使用location.getTime()之后,这是结果,所有测试都是在外部以中/高速进行的,每个设备在10分钟内进行记录

HTC Sensation Z710e 4.0.3 Internal GPS 1HZ

Average Accuracy: 12.1m       
Average intertval: 1186ms
Min: 98ms
Max: 2621ms


HTC Desire HD 4.0.4 Internal GPS 1HZ

Average Accuracy: 10.6m        
Average intertval: 1211ms
Min: 144ms
Max: 2588ms


ASUS Transformer TF101 4.0.4 Internal GPS 1HZ

Average Accuracy: 18.15m       
Average intertval: 1000MS
Min: 1000ms
Max: 1000ms


SAMSUNG NOTE II GT-N7100 4.1.2 Internal GPS 1HZ (Glonass)

Average Accuracy: 6.8m          
Average intertval: 1000MS
Min: 1000ms
Max: 1001ms


SAMSUNG, HTC OR ASUS  with external GPS 5HZ

Average Accuracy: 2.2m  
Average intertval: 200MS
Min: 200ms
Max: 200ms


SAMSUNG, HTC OR ASUS  with external GPS 10HZ (Glonass)

Average Accuracy: 1.6m    
Average intertval: 100MS
Min: 100ms
Max: 100ms

在虚拟化的多线程应用程序中没有精确的时间间隔。无论你是否使用计时器,当操作系统开始运行你的线程时,你都会收到通知。

当你收到位置时,不要看(系统)时间戳,看位置本身的时间戳,如果它是由GPS发送的,它应该正好是1000毫秒(1/hz)

Gps接收机从来不会发出奇数毫秒的信号,当使用1hz时,它们正好是1000毫秒。
使用location.getTime(),看看你自己。

你能扩展你的评论吗?你的操作系统正在运行一个线程,然后它切换到运行另一个线程。其中一个线程正在运行代码,以检查时钟是否满足特定的时间间隔。如果计时器线程在应用程序运行的整个时间内都在运行,那么它会在时间一过就通知您。但事实并非如此。相反,操作系统会不时运行计时器线程,每次运行时,它都会检查时钟,然后返回睡眠状态。您无法强制它在时间段已过的确切时刻运行。很可能另一个线程正在运行。我想说的是,您需要接受这样一个事实,即您只能非常接近理想的轮询间隔。那么,执行间隔的最佳/准确方法是什么?顺便说一句,很好的解释API允许您指定在接收下一次更新之前必须经过的最短时间和最短距离。但是,它不能让您指定接收GPS更新的时间间隔。是的!我在寻找currentTimeMillis()以了解经过的时间,这就是问题所在,太多Thanks我使用外部5和10 hz gps获得精确间隔(1s/hz),但使用内部1hz gps,有时我获得1s精确间隔,有时我获得0.6s和1.3s之间的间隔,我无法检测导致间隔不稳定的原因,准确度可能吗?如果是来自GPS,他们不应该改变,检查外部,或仅限于GPS定位。如果你仍然有变化,那么GPS在android手机上的实现是糟糕的。我正在使用LocationManager.GPS\u提供商,所以只锁定GPS,我在外面尝试过,大约8米的精度,我在两者上都试过,HTC DESIRE HD和HTC SENSATION,两者都有疯狂/随机的间隔。这听起来很糟糕,我一生中只听说过一个案例,这种偏离的时间戳。试着和其他人核实一下,然后把你的发现发布在这里。