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

概要

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

  • 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 へのアクセスについて詳細を確認する。