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 の変更点と、新しいクライアントを使用するようにアプリを更新する際に推奨される手順について説明します。
概要
主な変更点は次のとおりです。
- 新しいエントリ ポイントとして
GeoDataClientとPlaceDetectionClientの 2 つが追加されました。すべての API をカバーする 1 つのGoogleApiClientインスタンスを作成する代わりに、アプリでGeoDataClientとPlaceDetectionClientの両方をインスタンス化する必要があります。 - 接続コールバックは不要になったため、アプリを安全にリファクタリングして削除できます。
- 新しい 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 へのアクセスをご覧ください。