遷移至 GoogleApi 用戶端

Google Play 服務 SDK 11.2.0 版提供存取 Places SDK for Android 的新方式。GoogleApi 用戶端比前身 (GoogleApiClient) 更容易使用,因為它會自動管理與 Google Play 服務的連線。這可減少應用程式中的樣板程式碼數量,並有助於避免許多常見的陷阱。新版 API 改善了以下幾個項目:

  • 連線程序會自動管理,因此實作新版 API 的工作量較少。
  • API 呼叫現在會自動等待服務連線建立,因此不必等待 onConnected,即可提出要求。
  • Tasks API 可簡化非同步作業的組合程序。
  • 程式碼是獨立的,可以移至共用的公用程式類別或類似項目。

如要更新應用程式以使用 GoogleApi 用戶端,您必須對 Places SDK for Android 實作項目進行一些變更。本指南說明 Android 適用的 Places SDK 變更內容,並建議更新應用程式以使用新版用戶端時應採取的步驟。

總覽

主要異動如下:

  • 有兩個新進入點:GeoDataClientPlaceDetectionClient。 現在應用程式必須同時例項化 GeoDataClientPlaceDetectionClient,而不是建立一個 GoogleApiClient 例項來涵蓋所有 API。
  • 由於不再需要連線回呼,您可以安全地重構應用程式,移除這些回呼。
  • 新的 Places API 方法現在為非同步,並會傳回 Task,而非 PendingResult

載入 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 方法現在為非同步,並會傳回 Task,而非 PendingResult。資料結構並未變更,因此您現有的結果處理程式碼應不需要更新。下列程式碼範例會比較新版和舊版 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