GoogleApi クライアントに移行する

Google Play 開発者サービス SDK の 11.2.0 リリースには、Places SDK for Android にアクセスする新しい方法が含まれています。GoogleApi クライアントは、Google Play 開発者サービスへの接続を自動的に管理するため、以前のクライアント(GoogleApiClient)よりも使いやすいです。これにより、アプリ内のボイラープレート コードの量が減り、一般的な落とし穴を回避できます。新しい API には次のような改善点があります。

  • 接続プロセスは自動的に管理されるため、新しい API の実装作業が軽減されます。
  • API 呼び出しで、サービス接続が確立されるのを自動的に待機するようになり、リクエストを実行する前に onConnected を待機する必要がなくなりました。
  • Tasks API を使用すると、非同期オペレーションを簡単に作成できます。
  • コードは自己完結型で、共有ユーティリティ クラスなどに移動できます。

GoogleApi クライアントを使用するようにアプリを更新するには、Places SDK for Android の実装を変更する必要があります。このガイドでは、Android 版 Places SDK の変更点と、新しいクライアントを使用するようにアプリを更新する際の推奨手順について説明します。

概要

主な変更点は次のとおりです。

  • 新しいエントリ ポイントは GeoDataClientPlaceDetectionClient の 2 つです。すべての API に対応する 1 つの GoogleApiClient インスタンスを作成するのではなく、アプリは GeoDataClientPlaceDetectionClient の両方をインスタンス化する必要があります。
  • 接続コールバックが不要になったため、アプリを安全にリファクタリングして削除できます。
  • 新しい Places API メソッドは非同期になり、PendingResult ではなく Task を返すようになりました。

Places API を読み込む

Places API を読み込むには、エントリ ポイントを宣言し、次の例に示すように、フラグメントまたはアクティビティの onCreate() メソッドでクライアントをインスタンス化します。

// The entry points to the Places API.
private GeoDataClient mGeoDataClient;
private PlaceDetectionClient mPlaceDetectionClient;

...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Construct a GeoDataClient.
    mGeoDataClient = Places.getGeoDataClient(this, null);

    // Construct a PlaceDetectionClient.
    mPlaceDetectionClient = Places.getPlaceDetectionClient(this, null);

比較

新しい Places API メソッドは非同期になり、PendingResult ではなく Task を返すようになりました。データ構造は変更されていないため、結果を処理する既存のコードは更新する必要はありません。次のコード例は、GetCurrentPlace() の新しいバージョンと以前のバージョンを比較しています。

新しい方法

Task<PlaceLikelihoodBufferResponse> placeResult = mPlaceDetectionClient.getCurrentPlace(null);
placeResult.addOnCompleteListener(new OnCompleteListener<PlaceLikelihoodBufferResponse>() {
    @Override
    public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) {
        PlaceLikelihoodBufferResponse likelyPlaces = task.getResult();
        for (PlaceLikelihood placeLikelihood : likelyPlaces) {
            Log.i(TAG, String.format("Place '%s' has likelihood: %g",
                placeLikelihood.getPlace().getName(),
                placeLikelihood.getLikelihood()));
        }
        likelyPlaces.release();
    }
});

従来の方法

PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
    .getCurrentPlace(mGoogleApiClient, null);
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
  @Override
  public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
    for (PlaceLikelihood placeLikelihood : likelyPlaces) {
      Log.i(TAG, String.format("Place '%s' has likelihood: %g",
          placeLikelihood.getPlace().getName(),
          placeLikelihood.getLikelihood()));
    }
    likelyPlaces.release();
  }
});

その他の情報

詳しくは、Google API へのアクセスをご覧ください。