Migrar para o cliente GoogleApi

A versão 11.2.0 do SDK do Google Play Services inclui uma nova maneira de acessar o SDK do Places para Android. O cliente GoogleApi é mais fácil de usar do que o antecessor (GoogleApiClient), já que gerencia automaticamente as conexões com o Google Play Services. Isso reduz a quantidade de código clichê no app e ajuda a eliminar muitas armadilhas comuns. A nova API oferece várias melhorias:

  • O processo de conexão é gerenciado automaticamente, então a nova API exige menos trabalho para ser implementada.
  • As chamadas de API agora aguardam automaticamente o estabelecimento da conexão de serviço, eliminando a necessidade de esperar o onConnected antes de fazer solicitações.
  • A API Tasks facilita a composição de operações assíncronas.
  • O código é independente e pode ser movido para uma classe de utilidade compartilhada ou semelhante.

Para atualizar o app e usar o cliente GoogleApi, é necessário fazer algumas mudanças na implementação do SDK do Places para Android. Este guia descreve as mudanças no SDK do Places para Android e recomenda etapas a serem seguidas ao atualizar seu app para usar o novo cliente.

Visão geral

As principais áreas de mudança são:

  • Há dois novos pontos de entrada: GeoDataClient e PlaceDetectionClient. Em vez de criar uma instância GoogleApiClient para abranger todas as APIs, seu app agora precisa instanciar GeoDataClient e PlaceDetectionClient.
  • Como os callbacks de conexão não são mais necessários, você pode refatorar o app com segurança para removê-los.
  • Os novos métodos da API Places agora são assíncronos e retornam um Task em vez de um PendingResult.

Carregar a API Places

Para carregar a API Places, declare os pontos de entrada e instancie os clientes no método onCreate() do fragmento ou da atividade, conforme mostrado no exemplo a seguir:

// 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);

Comparação

Os novos métodos da API Places agora são assíncronos e retornam um Task em vez de um PendingResult. Como as estruturas de dados não mudaram, não é necessário atualizar o código atual para processar resultados. Os exemplos de código a seguir comparam as versões nova e anterior de GetCurrentPlace():

Como será agora

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();
    }
});

Como era antes

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();
  }
});

Saiba mais

Saiba mais sobre como acessar as APIs do Google.