作为SpeedView的开发商:GPS速度计为Android,我必须已经尝试过每个可能的解决方案这个问题,所有与相同的负面的结果。让我们重申一些不起作用:
> onStatusChanged()没有被调用Eclair和Froyo。
>简单地计数所有可用的卫星当然是无用的。
>检查任何卫星是否为usedInFix()返回true也不是很有帮助。系统显然丢失了修复,但仍然报告仍然有几个sats在其中使用。
所以这里是唯一的工作解决方案,我发现,我实际使用在我的应用程序。让我们假设我们有一个简单的类来实现GpsStatus.Listener:
private class MyGPSListener implements GpsStatus.Listener {
public void onGpsStatusChanged(int event) {
switch (event) {
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
if (mLastLocation != null)
isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;
if (isGPSFix) { // A fix has been acquired.
// Do something.
} else { // The fix has been lost.
// Do something.
}
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
// Do something.
isGPSFix = true;
break;
}
}
}
OK,现在在onLocationChanged()我们添加以下:
@Override
public void onLocationChanged(Location location) {
if (location == null) return;
mLastLocationMillis = SystemClock.elapsedRealtime();
// Do something.
mLastLocation = location;
}
就是这样。基本上,这是做到这一点的线:
isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;
你可以调整millis的价值当然,但我建议设置它大约3-5秒。
这实际上是工作,虽然我没有看过绘制本机GPS图标的源代码,这接近复制其行为。希望这有助于某人。