遷移至 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 的實作項目。本指南將說明 Places SDK for Android 的異動內容,以及更新應用程式以使用新版用戶端時可採取的步驟。

總覽

主要變動內容如下:

  • 有兩個新的進入點:GeoDataClientPlaceDetectionClient。 應用程式現在必須同時將 GeoDataClientPlaceDetectionClient 執行個體化,而非建立一個涵蓋所有 API 的 GoogleApiClient 執行個體。
  • 由於連線回呼不再需要使用,您可以安全地重構應用程式將其移除。
  • 新的 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