2016-05-07 8 views
0

私はonLocationChangedメソッドをLocationListenerのデバイスの位置の変化を検出するために使用しました。 requestLocationUpdatesメソッドでは、最小時間= 5秒と最小距離= 2メートルを設定していますが、requestLocationUpdatesメソッドはデバイスがまったく動かされていなくても(静止していても)私に更新を与えています。だから私のコードの問題は何ですか?requestLocationUpdates()メソッドが場所を変更せずに更新を提供しています - Android

この私のコード:

public class LocationDetector implements LocationListener { 
    @Override 
    public void onLocationChanged(Location location) { 
     Log.d("GPS: ",location.getLatitude()+", "+location.getLongitude()); 
    } 

LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

manager.requestLocationUpdates("gps", 5000, 2, new LocationDetector()); 

答えて

2

GPSの位置は変動する可能性があります。受信した場所を実際にログに記録すると、場所の更新が来るたびに実際に場所が2メートル以上変化することがわかります。

編集:変動に対処するためのアイデアを追加しました:GPSの変動に対処する方法

は、アプリケーションのニーズによって異なります。

実際に正確な場所が必要ない場合は、requestLocationUpdates()コールの距離の制限を大きくして、非常に小さな場所の変更については更新を受信しないようにしてください。ユースケースで必要とされる絶対的に必要な精度は何か考えてから、可能な限り高い距離制限を使用してください。

場所が非常に迅速に変更されると思わない場合、または場所の変更に非常に迅速に反応する必要がない場合は、requestLocationUpdates()コールで時間制限を長くしてください。これは、ネットワーク経由で何らかのデータを常に取得する場合(逆ジオコーディングなど)のように、非常に重いコードがonLocationChanged()によってトリガーされている場合にも意味があります。

制限時間もバッテリの使用に大きな影響を与えます。 Android documentationは言う:

...場所プロバイダが minDistanceパラメータを使用して電力を節約することがより困難であるので、MINTIMEは、バッテリ寿命を節約 する主要なツールである必要があります。

本当に正確な場所が必要な場合は、変動を減らすいくつかの方法があります。

まず、に受信されたオブジェクトは、Location.getAccuracy()メソッドを呼び出して推定精度を得ることができます。以前のロケーション更新の精度と比較して、精度が非常に低いロケーション更新を無視することができます。

また、最新の場所の短いバッファがある場合は、フィルタリングを行うこともできます。平均値を計算すると急激な変化量は減少しますが、応答時間も増加します。つまり、場所の急激な変化は、しばらくしてから平均位置データに完全に現れます。 (もちろん、平均化されたデータは、すぐにその場所に向かって移動を開始しますが、しばらく時間がかかります)また、「スパイクのトラフをいくらかの量にします。

応答時間が重要で、データの大きな「スパイク」を排除する必要がある場合は、中央値の計算が最適です。それはデータの小さな変化をそれほど滑らかにしませんが、ランダムなスパイクをフィルタリングすることができます。実際の(恒久的な)場所の突然の変化がある場合、メジアン・フィルタリングは非常に小さな遅延でしか反応しません。

(このようなことは、お気に入りのスプレッドシートアプリケーションで簡単に試すことができます)

+0

しかし、私のデバイスはまったく動いていません。実際に場所の変化を実際に検出するにはどうすればよいですか? –

+0

変更の量を確認して、何らかのアクションを引き起こすかどうかを判断するだけです。または、 'requestLocationUpdates()'の呼び出しで与えた距離の制限を、より高い番号に変更します。場所が変動し、ユースケースに最も適した方法でコード内でこれを考慮に入れることができます。 –

関連する問題