Migrer vers le client GoogleApi

La version 11.2.0 du SDK des services Google Play inclut une nouvelle façon d'accéder au SDK Places pour Android. Le client GoogleApi est plus facile à utiliser que son prédécesseur (GoogleApiClient), car il gère automatiquement les connexions aux services Google Play. Cela réduit la quantité de code passe-partout dans votre application et peut vous aider à éviter de nombreux pièges courants. Cette nouvelle API présente plusieurs avantages :

  • Le processus de connexion étant géré automatiquement, la nouvelle API est plus facile à implémenter.
  • Les appels d'API attendent désormais automatiquement que la connexion de service soit établie, ce qui évite d'attendre onConnected avant d'envoyer des requêtes.
  • L'API Tasks facilite la composition des opérations asynchrones.
  • Le code est autonome et peut être déplacé dans une classe d'utilitaires partagée ou similaire.

Pour mettre à jour votre application afin qu'elle utilise le client GoogleApi, vous devez apporter quelques modifications à votre implémentation du SDK Places pour Android. Ce guide décrit les modifications apportées au SDK Places pour Android et recommande les étapes à suivre lors de la mise à jour de votre application pour utiliser le nouveau client.

Présentation

Voici les principaux domaines concernés par les modifications :

  • Deux nouveaux points d'entrée sont disponibles : GeoDataClient et PlaceDetectionClient. Au lieu de créer une instance GoogleApiClient pour couvrir toutes les API, votre application doit désormais instancier GeoDataClient et PlaceDetectionClient.
  • Étant donné que les rappels de connexion ne sont plus nécessaires, vous pouvez refactoriser votre application en toute sécurité pour les supprimer.
  • Les nouvelles méthodes de l'API Places sont désormais asynchrones et renvoient un Task plutôt qu'un PendingResult.

Charger l'API Places

Pour charger l'API Places, déclarez les points d'entrée, puis instanciez les clients dans la méthode onCreate() de votre fragment ou de votre activité, comme illustré dans l'exemple suivant :

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

Comparaison

Les nouvelles méthodes de l'API Places sont désormais asynchrones et renvoient un Task plutôt qu'un PendingResult. Les structures de données n'ont pas changé. Vous ne devriez donc pas avoir besoin de mettre à jour votre code existant pour gérer les résultats. Les exemples de code suivants comparent les nouvelles et anciennes versions de GetCurrentPlace() :

La nouvelle méthode

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

Ancienne méthode

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

En savoir plus

En savoir plus sur l'accès aux API Google