9

PendingIntentに渡すmy で余分な文字列を送信するのに問題がありますLocationServices.FusedLocationApi.requestLocationUpdates(GoogleApiClient client, LocationRequest request, PendingIntent callbackIntent)

私が追加しているユーザー名のエクストラが、 returnとして私に渡そうとしてIntentいる場所を台無しにしているようです。requestLocationUpdatesIntentServiceintent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED)null

編集

User実装するクラスを作成して、Parcelableそれを追加してみました:

mRequestLocationUpdatesIntent.putExtra("username", new User(username));

また、このバグレポートhttps://code.google.com/p/android/issues/detail?id=81812のコメントで提案されているように、Parcelable User内部を配置しようとしました:Bundle

Bundle userBundle = new Bundle();
userBundle.putParcelable("user", new User(username));
mRequestLocationUpdatesIntent.putExtra("user", userBundle);

私のサービスで:

Bundle userBundle = intent.getBundleExtra("user");
User user = userBundle.getParcelable("user");
String username = user.getUsername();

ただし、これらのアプローチのどちらも違いはありません。インテントに余分なものを追加すると、更新が発生したときに場所がインテントに追加されることはありません。

IntentService位置情報の更新を処理するためにこれをセットアップします。

public class LocationUpdateService extends IntentService {

    private final String TAG = "LocationUpdateService";

    public LocationUpdateService() {
        super("LocationUpdateService");
    }


    @Override
    protected void onHandleIntent(Intent intent) {

        Log.d(TAG, "onHandleIntent");

        Bundle extras = intent.getExtras();
        Log.d(TAG, "keys found inside intent: " + TextUtils.join(", ", extras.keySet()));

        String username = intent.getStringExtra("username");

        if (username != null) {
            Log.d(TAG, "username: " + username);
        } else {
            Log.d(TAG, "username: null");
        }

        if (!intent.hasExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED)) {
            Log.d(TAG, "intent does not have location :(");
        }

        Location location = intent.getParcelableExtra(FusedLocationProviderApi.KEY_LOCATION_CHANGED);

        if (location == null) {
            Log.d(TAG, "location == null :(");
        }

        Log.d(TAG, "latitude " + String.valueOf(location.getLatitude()));
        Log.d(TAG, "longitude " + String.valueOf(location.getLongitude()));

        ...

    }


}

ユーザーがボタンをクリックするstartLocationUpdatesと、メイン アクティビティで が呼び出されます。

主な活動クラス:

...

Boolean mLocationUpdatesEnabled = false;

protected void createLocationRequest() {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(LOCATION_UPDATE_INTERVAL);
    mLocationRequest.setFastestInterval(LOCATION_UPDATE_FASTEST_INTERVAL);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

protected void startLocationUpdates() {

    Log.d(TAG, "startng location updates...");

    mLocationUpdatesEnabled = true;

    if (mLocationRequest == null) {
        createLocationRequest();
    }

    // create the Intent to use WebViewActivity to handle results
    Intent mRequestLocationUpdatesIntent = new Intent(this, LocationUpdateService.class);

    // create a PendingIntent
    mRequestLocationUpdatesPendingIntent = PendingIntent.getService(getApplicationContext(), 0,
            mRequestLocationUpdatesIntent,
            PendingIntent.FLAG_CANCEL_CURRENT);

    // request location updates
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
            mLocationRequest,
            mRequestLocationUpdatesPendingIntent);

    Log.d(TAG, "location updates started");
}

protected void stopLocationUpdates() {

    Log.d(TAG, "stopping location updates...");

    mLocationUpdatesEnabled = false;

    LocationServices.FusedLocationApi.removeLocationUpdates(
            mGoogleApiClient,
            mRequestLocationUpdatesPendingIntent);

    Log.d(TAG, "location updates stopped");
}

これはすべてうまく機能します。ユーザーがボタンを押すと、toggleLocationUpdatesが呼び出され、 が呼び出され、 が呼び出されて、場所を取得できる場所がLocationServices.FusedLocationApi.requestLocationUpdates呼び出されます。LocationUpdateService

Intent問題は、 Intent.putExtra(String, String) を使用して文字列エクストラを追加しようとしたときに発生します。

主な活動クラス:

...
protected void startLocationUpdates(String username) {
    ....

    // create the Intent to use WebViewActivity to handle results
    Intent mRequestLocationUpdatesIntent = new Intent(this, LocationUpdateService.class);

    //////////////////////////////////////////////////////////////////
    //
    //  When I put this extra, IntentService sees my username extra
    //  but the parcelableExtra `location` == null :(
    // 
    //////////////////////////////////////////////////////////////////

    mRequestLocationUpdatesIntent.putExtra("username", username);
    ...
}
...

編集 私は次の文を質問ではなく声明として始めました:「私は...を使用しています」

この場所の更新処理に追加のデータを送信するための正しいアプローチを使用していますかIntentService、それとももっとまともな方法がありますか?

これはバグですか、それとも単に貧弱なドキュメントですか?

4

1 に答える 1