web-dev-qa-db-ja.com

融合ロケーションプロバイダー:ロケーションの更新が失敗したかどうかを確認する方法はありますか?

はじめに

私のアプリでは、ユーザーが現在いる場所の1回限りの正確な場所を取得したいと思います。 FusedLocationProviderApi.getLastLocationを使用すると、これがキャッシュされた場所を取得し、新しい場所の更新を要求しないことがわかったため、これがnullまたは古い場所になることがありました。

解決策は、以下に示すように、場所の更新を1回だけ要求することでした。

 LocationRequest locationRequest  = LocationRequest.create()
                .setNumUpdates(1)
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(0);

        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this)

今、私は常により正確な位置を取得します。

私の質問

場所の更新が失敗したかどうかを確認するにはどうすればよいですか?私は1つだけを要求しているので。

場所の更新が取得されると、このコールバックが呼び出されます

 @Override
 public void onLocationChanged(Location location) {

 }

ただし、場所の更新が失敗した場合、これは呼び出されません。

私が試したこと

ResultCallbackがあるのを見ました。ただし、1回限りの場所の更新が失敗した場合でも、onSuccessは常に呼び出されるようです。

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,locationRequest,this).setResultCallback(new ResultCallbacks<Status>() {
            @Override
            public void onSuccess(@NonNull Status status) {
                DebugUtils.log("requestLocationUpdates ResultCallback onSuccess + " + status.toString(),true,true);
            }

            @Override
            public void onFailure(@NonNull Status status) {
                DebugUtils.log("requestLocationUpdates ResultCallback onFailure + " + status.toString(),true,true);
            }
        });

その他

com.google.Android.gms:play-services-location:8.4.0の使用

読んでくれてありがとう、助けてください。

14
Ersen Osman

APIをもう少し掘り下げていくつかのテストを行った後、問題が解決したように見えました。

_ LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult result) {
                DebugUtils.log("onLocationResult");
            }

            @Override
            public void onLocationAvailability(LocationAvailability locationAvailability) {
                DebugUtils.log("onLocationAvailability: isLocationAvailable =  " + locationAvailability.isLocationAvailable());
            }
        }, null);
_

LocationListenerを使用する代わりに。 LocationCallbackを使用しました

onLocationResultは、LocationRequestに基づいて最新のロケーション結果を提供するためにのみ呼び出されます。位置情報を提供できなかった場合は呼び出されません。また、私のテストでは、位置情報が無効になっていて、GPSが屋内などで使用された場合も呼び出されません。実際の位置情報オブジェクトを取得するには、result.getLastLocation()を呼び出してください。

onLocationAvailablityは常に呼び出されます。 locationAvailability.isLocationAvailable()アクティブなLocationRequestsによって要求されたヒント内でデバイスの場所がわかっていて、適度に最新である場合、trueを返します。位置設定の無効化やデバイスの環境でセンサーデータを取得できないなど、さまざまな原因で位置を特定できない場合は、Falseが返されます。

私は位置情報サービスなしで、屋内でのみGPSをテストしました。いずれの場合も、既存のロケーション履歴をすべて削除しました(キャッシュされたロケーションを防ぐため)。正確な最新の場所が常に返されました。

他の人がこれを保証できますか?

注:requestLocationUpdates呼び出しの最後のパラメーターはルーパーです。 nullを渡すと、呼び出し元のスレッドのメッセージキューが使用されます。

30
Ersen Osman