La versión 11.2.0 del SDK de Servicios de Google Play incluye una nueva forma de acceder al SDK de Places para Android. El cliente GoogleApi
es más fácil de usar que su predecesor (GoogleApiClient
), ya que administra automáticamente las conexiones a los Servicios de Google Play. Esto reduce la cantidad de código estándar en tu app y puede ayudar a eliminar muchos de los errores comunes. La nueva API ofrece varias mejoras:
- El proceso de conexión se administra automáticamente, por lo que la implementación de la API nueva requiere menos trabajo.
- Las llamadas a la API ahora esperan automáticamente a que se establezca la conexión del servicio, lo que elimina la necesidad de esperar
onConnected
antes de realizar solicitudes. - La API de Tasks facilita la redacción de operaciones asíncronas.
- El código es autónomo y se puede mover fácilmente a una clase de utilidad compartida o a una similar.
La actualización de tu app para que use el cliente GoogleApi
requiere algunos cambios en tu implementación del SDK de Places para Android. En esta guía, se describen los cambios en el SDK de Places para Android y se recomiendan los pasos que debes seguir cuando actualices tu app para usar el cliente nuevo.
Descripción general
Las principales áreas de cambio son las siguientes:
- Hay dos puntos de entrada nuevos:
GeoDataClient
yPlaceDetectionClient
. En lugar de crear una instancia deGoogleApiClient
para abarcar todas las APIs, tu app ahora debe crear una instancia deGeoDataClient
yPlaceDetectionClient
. - Dado que ya no se requieren devoluciones de llamada de conexión, puedes refactorizar de forma segura tu app para quitarlas.
- Los nuevos métodos de la API de Places ahora son asíncronos y muestran un
Task
en lugar de unPendingResult
.
Carga la API de Places
Para cargar la API de Places, declara los puntos de entrada y, luego, crea una instancia de los clientes en el método onCreate() de tu fragmento o actividad, como se muestra en el siguiente ejemplo:
// 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);
Comparación
Los nuevos métodos de la API de Places ahora son asíncronos y muestran un Task
en lugar de un PendingResult
. Las estructuras de datos no cambiaron, por lo que no debería ser necesario actualizar tu código existente para manejar los resultados.
En los siguientes ejemplos de código, se comparan las versiones nueva y anterior de GetCurrentPlace()
:
La nueva forma
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(); } });
El método tradicional
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(); } });
Más información
Obtén más información para acceder a las APIs de Google.