17

私は私の最後の既知の場所を取得していますが、私の場所が最後に更新されてからどれくらいの時間が経過していません。場所が最後に更新されてからどのくらいの時間が経過したかを知るにはどうすればよいですか?

LocationManager locationManager 
                        = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_FINE);
    c.setAccuracy(Criteria.ACCURACY_COARSE);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setCostAllowed(true);
    c.setPowerRequirement(Criteria.POWER_HIGH);
String provider = locationManager.getBestProvider(c, true);
Location location = locationManager.getLastKnownLocation(provider);
4

4 に答える 4

25

API17の前後の両方に最適なオプション:

public int age_minutes(Location last) {
    return age_ms(last) / (60*1000);
}

public long age_ms(Location last) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
        return age_ms_api_17(last);
    return age_ms_api_pre_17(last);
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private long age_ms_api_17(Location last) {
    return (SystemClock.elapsedRealtimeNanos() - last
            .getElapsedRealtimeNanos()) / 1000000;
}

private long age_ms_api_pre_17(Location last) {
    return System.currentTimeMillis() - last.getTime();
}

pre 17はあまり正確ではありませんが、場所が非常に古いかどうかをテストするには十分なはずです。

これは、私が思うに、大丈夫だと思います:

if (age_minutes(lastLoc) < 5) {
   // fix is under 5 mins old, we'll use it

} else {
   // older than 5 mins, we'll ignore it and wait for new one

}

このロジックの通常の使用例は、アプリが起動したばかりで、新しい場所を待つ必要があるのか​​、新しい場所を待つ間、今のところ最新のものを使用できるのかを知る必要がある場合です。

于 2014-03-28T16:35:38.990 に答える
7

これを再開して申し訳ありませんが、ウェストンの答えは間違っていると思います。Androidのドキュメントは少なくとも誤解を招くものです。

getTime()のタイムベースは、System.currentTimeMillis()ではなく、GPSモジュールから受信したNMEAセンテンスから決定されるUTCです。GPS時間はナノ秒単位で正確です(電磁波は1nsで30cm移動するため、正確である必要があります)。ここでの唯一の問題は、GPSのうるう秒が原因で1秒ずれている可能性があることです([1]を参照。これは、GPSがパワーサイクル全体のUTCオフセットを記憶するのに十分インテリジェントであると仮定すると、数年ごとに数分間発生する可能性があります。 )。

一方、System.currentTimeMillis()は、ドリフトが原因で数秒/分ずれたり、ユーザーが時刻/日付を誤って設定した場合はさらにずれたりする可能性があります。

したがって、API 17より前の唯一の実際の解決策は、位置の更新を定期的に受信し、毎回SystemClock.elapsedRealtime()に基づいて独自のタイムスタンプを記録することです。

サムスンS4でこれを試しました。他の電話で異なる結果が得られる場合は、修正してください。しかし、私はそれを疑っています。

[1] http://en.wikipedia.org/wiki/Global_Positioning_System#Leap_seconds

于 2015-02-22T17:42:49.247 に答える
5

Location.getTime()は、実際には、最後に認識された場所の年齢を見つけるための最良の方法ではありません。

JavaDocから:

この修正のUTC時刻を、1970年1月1日からのミリ秒単位で返します。

デバイスのUTC時間は単調ではないことに注意してください。予期せずに、前方または後方にジャンプする可能性があります。したがって、時間デルタを計算するときは、常にgetElapsedRealtimeNanosを使用してください。

使用する2つの方法は次のとおりです。

SystemClock.elapsedRealtimeNanos();
Location.getElapsedRealtimeNanos();

LocationManager.lastKnownLocation()がnullを返す場合があることにも注意してください。

于 2014-03-15T20:03:49.350 に答える
1

各場所には時間属性があります。getTime().現在の時刻と比較して取得します。(差を計算します)。これはあなたに「年齢」を与えます。

于 2013-03-09T12:19:52.370 に答える