2

Google Play Services の Fused Location Provider API を使用すると、ロケーション リスナーまたは保留中のインテントを使用してロケーションの更新をリクエストできます。ロケーション リスナーを使用してロケーションの更新を正常にリクエストできますが、保留中のインテントで同じ動作を再現するのに苦労しています。後者については、位置データを処理するインテント サービスを起動します。テスト中に気付いたのは、ロケーションの更新が、ロケーション リクエストで設定した間隔と一致していることです。ただし、ロケーション要求の間隔が一定のままであっても、時間が経つにつれて、更新の間隔が大幅に増加します。複数のデバイスで何度かこの動作に気付きました。何が起こっているのか誰にも分かりますか?

フォアグラウンド位置追跡

protected void requestLocationUpdates()
{
    mIsTracking = true;
    LocationRequest locationRequest = mLocationRequests.get(mPreviousDetectedActivity.getType());
    if (locationRequest != null)
    {
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this);
    }
}

@Override
public void onLocationChanged(Location location)
{
    Log.i(TAG, "onLocationChanged");
    handleLocationChanged(location);
}

バックグラウンドでの位置追跡

protected void requestLocationUpdates()
{
    LocationRequest locationRequest = mLocationRequests.get(mPreviousDetectedActivity.getType());
    if (locationRequest != null)
    {
        mResultCallabackMessage = "Request location updates ";
        PendingIntent pendingIntent = getLocationPendingIntent();
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                locationRequest, pendingIntent).setResultCallback(this);
    }
}

protected PendingIntent getLocationPendingIntent()
{
    if (mLocationPendingIntent != null) return mLocationPendingIntent;

    Intent intent = new Intent(this, LocationUpdatesIntentService.class);
    mLocationPendingIntent = PendingIntent.getService(this, 0, intent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    return mLocationPendingIntent;
}

public class LocationUpdatesIntentService extends IntentService
{

    public LocationUpdatesIntentService()
    {
        // Use the TAG to name the worker thread.
        super(TAG);
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
    }

    @Override
    protected void onHandleIntent(Intent intent)
    {
        Bundle bundle = intent.getExtras();
        Location location = (Location)   bundle.get(FusedLocationProviderApi.KEY_LOCATION_CHANGED);

        handleLocationUpdates(location);
    } 
}

どんな助けでも大歓迎です。

4

2 に答える 2

0

デバイス内の他のアプリケーションが、より頻繁な更新を要求したに違いないことが原因である可能性があります。詳細については、このリンクを参照してください

この間隔は不正確です。更新がまったく受信されない場合 (ロケーション ソースが利用できない場合) や、要求よりも遅く受信される場合があります。また、要求よりも早くそれらを受信することもあります (他のアプリケーションがより速い間隔で位置情報を要求している場合)。更新を受信する最速の速度は、setFastestInterval(long) で制御できます。

于 2015-08-15T07:12:33.317 に答える