2016-10-12 9 views
0

私のアプリでは、毎秒複数回実行されるコードがあります。私はすべてのサイクルで私の場所を取得しようとしています。私は以下を使用しています:Android融合位置情報APIが画面の一貫した更新を提供しない

Location myLastPos = LocationServices.FusedLocationApi.getLastLocation(googleApiClient) 

また、私のアプリはPARTIAL_WAKE_LOCKを使用してバックグラウンドで実行されます。すべての画面でOKと思われます。画面をオフにするとアプリは正常に動作しますが、一貫して位置情報の更新は行われません。 アップデートの頻度はずっと少なくなっているようです(アップデートの間にしばしば数分)。私は場所のタイムスタンプをチェックしています:

私はまた、画面がオンになっても、私はいくつかの奇妙な結果を得ることがわかりました。時々、更新の間に数ミリ秒かかることがあります。数秒かかる場合もあります。これはすべて非常に重要です。誰かが私がFusedLocationApiを正しく使うのを助けることができるかまたはは別の方法を提案します。私が本当に欲しいのは、緯度/経度のGPSを直接ポーリングすることです

+0

'getLastLocation()'メソッドは、デバイスが知っている最後の既知の場所を取得します。デバイスは、自分の場所を特定するのではなく、アプリケーションによって場所が要求された場合にのみ、その場所を判断します。だから、あなたのアプリは現在、位置の更新を要求する他のアプリケーションに依存しています。数秒ごとに更新が必要な場合は、定期的に場所の更新をリクエストしてください。 [ドキュメントのセクション](http://stackoverflow.com/documentation/android/1837/location#t=201610120710565214353)にはコード例があります。 –

+0

@MarkusKauppinenあなたが正しいです。ドキュメントはこれについてあまり明確ではなく、私の前提はアンドロイドOSがバックグラウンドで自動的にGPSをポーリングし、getLastLocation()が_latest_結果を提供するということでした。あなたのコメントで質問に答えると、私はそれを回答としてマークすることができます。ありがとう! – Shahin

+0

これはよくある混乱のようです。何らかの形でドキュメントが古いと無効な場所かもしれないことを明らかにするかもしれません。技術的には、実際には「最新の既知の場所」なので正しいです。とにかく、私は今すぐ適切な答えを加えました。これはいくつかの古い質問と重複する可能性がありますが、私は簡単には良い候補を見つけることができませんでした。それらのほとんど(受け入れられた回答を持つ)はちょうど 'ヌル'の場所を取得しています。 –

答えて

0

getLastLocation()メソッドは、デバイスが知っている最後の既知の場所を取得します。ここでの「最後の既知の場所」とは、最新のものではない可能性があることを意味します。場所にはタイムスタンプが付いています。このタイムスタンプは、場所がまだ関連しているかどうかを判断するために使用できます。

デバイスは、自分の場所を特定しませんが、アプリケーションによってはその場所が要求された場合に限ります。だから、あなたのアプリは現在、位置の更新を要求する他のアプリケーションに依存しています。

数秒ごとに更新が必要な場合は、定期的に場所の更新をリクエストしてください。

Android documentationは、FusedLocationProviderを推奨していますが、LocationManagerは、Google Playサービスを避ける理由があれば、完全に有効なオプションです。更新はリスナーによって受信され

// Using LocationManager as an example. 
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
// Using GPS, requesting location updates as soon as available and even for 
// the smallest changes. Here 'this' refers to our LocationListener 
// implementation. 
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

基本的な考え方は、最初の要求の位置情報の更新にある

@Override 
    public void onLocationChanged(Location location) { 
     // We received a location update. 
     // Copy the value from the method parameter to our 
     // class member variable. 
     mLocation = location; 
    } 

をそして、あなたは、もはや更新を必要とするとき、あなたは要求を取り消してはなりません:

mLocationManager.removeUpdates(this); 

アプローチは、FusedLocationPrオービルダー。

関連する問題