迁移到 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 版 Google 地图 SDK 的变更,并建议您在更新应用以使用新客户端时采取的步骤。

概览

主要变更领域如下:

  • 有两个新的入口点:GeoDataClientPlaceDetectionClient。现在,您的应用必须同时实例化 GeoDataClientPlaceDetectionClient,而不是创建一个 GoogleApiClient 实例来涵盖所有 API。
  • 由于不再需要连接回调,因此您可以安全地重构应用以将其移除。
  • 新的 Google 地图 API 方法现在是异步的,并会返回 Task,而不是 PendingResult

加载 Places API

如需加载 Places API,请声明入口点,然后在 fragment 或 activity 的 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);

比较

新的 Google 地图 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