0

アプリで 1 秒間に複数回実行されるコードがあります。私はすべてのサイクルで自分の場所を取得しようとしています。私は以下を使用しています:

Location myLastPos = LocationServices.FusedLocationApi.getLastLocation(googleApiClient)

私のアプリは、PARTIAL_WAKE_LOCK を使用してバックグラウンドでも実行されます。すべての画面で問題ないようです。画面をオフにしても、アプリは正常に動作しますが、位置情報の更新が一貫して取得されなくなりました。更新頻度がずっと低いようです (多くの場合、更新の間に数分かかります)。次を使用して、場所のタイムスタンプを確認しています。

myLastPos.getElapsedRealtimeNanos()

画面がオンのときでも、奇妙な結果が得られることもわかりました。更新の間に数ミリ秒かかることもあれば、数秒かかることもあります。これはすべて非常に懸念されます。誰かが FusedLocationApi を適切に使用するのを手伝ってくれるか代替案を提案してくれますか? 私が本当に欲しいのは、Googleライブラリが邪魔をすることなく、緯度/経度を1秒に数回直接gpsにポーリングすることです。

4

1 に答える 1

0

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

デバイスはそれ自体で位置を特定するのではなく、一部のアプリケーションが位置を要求した場合にのみ特定します。したがって、アプリは現在、位置情報の更新を要求する他のアプリケーションに依存しています。

数秒ごとに更新する必要がある場合は、定期的な位置情報の更新を自分でリクエストしてください。

Android のドキュメントでは FusedLocationProvider を推奨していますが、Google Play サービスを避ける理由がある場合は、 LocationManagerも完全に有効なオプションです。

基本的な考え方は、最初に場所の更新をリクエストすることです。

// 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);

このアプローチは、FusedLocationProvider の場合と非常によく似ています。

于 2016-10-14T08:32:36.260 に答える