Puedes usar el SDK de Places para Android para solicitar una foto de lugar que se mostrará en tu aplicación. Las fotos que muestra el servicio de fotos provienen de diversas fuentes, como propietarios de empresas y fotos aportadas por los usuarios.
Elige el formato de la foto
El SDK de Places para Android admite dos formatos para la foto solicitada:
- Todas las versiones del SDK de Places para Android: Muestra la imagen de mapa de bits. La imagen de mapa de bits tiene un tamaño máximo de 1,600 por 1,600 píxeles.
- SDK de Places para Android (nuevo) versión 3.4 y posteriores: Muestra un URI a la imagen de mapa de bits. La imagen de mapa de bits tiene un tamaño máximo de 4800 por 4800 píxeles.
Proceso de recuperación de fotos
Para recuperar una imagen de un lugar, sigue estos pasos:
- Usa Place Details para recuperar un objeto
Place
(usafetchPlace()
ofindCurrentPlace()
). Asegúrate de incluir el campoPlace.Field PHOTO_METADATAS
en la lista de campos que se incluirán en el objetoPlace
de respuesta. - En el
OnSuccessListener
de tuFetchPlaceResponse
oFindCurrentPlaceResponse
, haz lo siguiente:- Usa
Place.getPhotoMetadas()
para obtener el objeto de metadatos de la foto, del tipoPhotoMetadata
, a partir del objetoPlace
de respuesta. - Para obtener una imagen de mapa de bits, haz lo siguiente:
- Crea un objeto
FetchPhotoRequest
y, de manera opcional, especifica la altura y el ancho máximos (en píxeles). Las fotos pueden tener un ancho o alto máximo de 1,600 px. - Usa
PlacesClient.fetchPhoto()
para solicitar el mapa de bits de la foto. - Agrega un
OnSuccessListener
y obtén la foto desdeFetchPhotoResponse
.
- Crea un objeto
- Para obtener el URI de una foto, haz lo siguiente:
- Crea un objeto
FetchResolvedPhotoUriRequest
para realizar la solicitud. Las fotos pueden tener un ancho o alto máximo de 4,800 px. - Usa
PlacesClient.fetchResolvedPhotoUri()
para solicitar el URI de la foto. - Agrega un
OnSuccessListener
y obtén el URI de la foto del objetoFetchResolvedPhotoUriResponse
.
- Crea un objeto
- Usa
Acceder a datos de PhotoMetadata agregados en la versión 3.3.0 y posteriores
El SDK de Places para Android (nuevo) agrega el campo AuthorAttributions
a la clase PhotoMetadata
. Si tu app habilita el SDK nuevo, el objeto PhotoMetadata
que muestra Place.getPhotoMetadas()
puede contener una o más atribuciones de autor.
Cuando el objeto PhotoMetadata
contiene atribuciones, ya sea las nuevas atribuciones del autor agregadas en la versión 3.3.0 o las atribuciones existentes disponibles en la versión 3.2.0 o anteriores, debes mostrarlas con la foto. Para obtener más información sobre cómo controlar todos los tipos de atribuciones, consulta Atribuciones.
Para propagar el objeto PhotoMetadata
con atribuciones de autor, debes hacer lo siguiente:
- Habilita el SDK nuevo cuando configures tu proyecto de Google Cloud.
- Inicializa el nuevo SDK dentro de una actividad o un fragmento.
- Incluye el
Place.Field.PHOTO_METADATAS
en la lista de campos de la solicitud de detalles del lugar. - Llama a
PlacesClient.fetchPlace()
para obtener el objetoPlace
y aPlace.getPhotoMetadas()
para obtener el objetoPhotoMetadata
. El campo de atribuciones del autor no es compatible conPlacesClient.findCurrentPlace()
. - Usa
PhotoMetadata.getAuthorAttributions()
para obtener atribuciones de autor.
Toma una foto
En esta sección, se describe cómo recuperar una foto como mapa de bits o como URI.
Cómo obtener una foto de un lugar como mapa de bits
En el siguiente ejemplo, se muestra cómo obtener una foto de un lugar como un mapa de bits.
Kotlin
// Define a Place ID. val placeId = "INSERT_PLACE_ID_HERE" // Specify fields. Requests for photos must always have the PHOTO_METADATAS field. val fields = listOf(Place.Field.PHOTO_METADATAS) // Get a Place object (this example uses fetchPlace(), but you can also use findCurrentPlace()) val placeRequest = FetchPlaceRequest.newInstance(placeId, fields) placesClient.fetchPlace(placeRequest) .addOnSuccessListener { response: FetchPlaceResponse -> val place = response.place // Get the photo metadata. val metada = place.photoMetadatas if (metada == null || metada.isEmpty()) { Log.w(TAG, "No photo metadata.") return@addOnSuccessListener } val photoMetadata = metada.first() // Get the attribution text. val attributions = photoMetadata?.attributions // Create a FetchPhotoRequest. val photoRequest = FetchPhotoRequest.builder(photoMetadata) .setMaxWidth(500) // Optional. .setMaxHeight(300) // Optional. .build() placesClient.fetchPhoto(photoRequest) .addOnSuccessListener { fetchPhotoResponse: FetchPhotoResponse -> val bitmap = fetchPhotoResponse.bitmap imageView.setImageBitmap(bitmap) }.addOnFailureListener { exception: Exception -> if (exception is ApiException) { Log.e(TAG, "Place not found: " + exception.message) val statusCode = exception.statusCode TODO("Handle error with given status code.") } } }
Java
// Define a Place ID. final String placeId = "INSERT_PLACE_ID_HERE"; // Specify fields. Requests for photos must always have the PHOTO_METADATAS field. final List<Place.Field> fields = Collections.singletonList(Place.Field.PHOTO_METADATAS); // Get a Place object (this example uses fetchPlace(), but you can also use findCurrentPlace()) final FetchPlaceRequest placeRequest = FetchPlaceRequest.newInstance(placeId, fields); placesClient.fetchPlace(placeRequest).addOnSuccessListener((response) -> { final Place place = response.getPlace(); // Get the photo metadata. final List<PhotoMetadata> metadata = place.getPhotoMetadatas(); if (metadata == null || metadata.isEmpty()) { Log.w(TAG, "No photo metadata."); return; } final PhotoMetadata photoMetadata = metadata.get(0); // Get the attribution text. final String attributions = photoMetadata.getAttributions(); // Create a FetchPhotoRequest. final FetchPhotoRequest photoRequest = FetchPhotoRequest.builder(photoMetadata) .setMaxWidth(500) // Optional. .setMaxHeight(300) // Optional. .build(); placesClient.fetchPhoto(photoRequest).addOnSuccessListener((fetchPhotoResponse) -> { Bitmap bitmap = fetchPhotoResponse.getBitmap(); imageView.setImageBitmap(bitmap); }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { final ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + exception.getMessage()); final int statusCode = apiException.getStatusCode(); // TODO: Handle error with given status code. } }); });
Cómo obtener el URI de una foto de un lugar
En el siguiente ejemplo, se muestra cómo obtener el URI de una foto de lugar.
// Define a Place ID. final String placeId = "INSERT_PLACE_ID_HERE"; // Specify fields. Requests for photos must always have the PHOTO_METADATAS field. final List<Place.Field> fields = Collections.singletonList(Place.Field.PHOTO_METADATAS); // Get a Place object (this example uses fetchPlace(), but you can also use findCurrentPlace()) final FetchPlaceRequest placeRequest = FetchPlaceRequest.newInstance(placeId, fields); placesClient.fetchPlace(placeRequest).addOnSuccessListener((response) -> { final Place place = response.getPlace(); // Get the photo metadata. final List<PhotoMetadata> metadata = place.getPhotoMetadatas(); if (metadata == null || metadata.isEmpty()) { Log.w(TAG, "No photo metadata."); return; } final PhotoMetadata photoMetadata = metadata.get(0); // Get the attribution text. final String attributions = photoMetadata.getAttributions(); // Create a FetchResolvedPhotoUriRequest. final FetchResolvedPhotoUriRequest photoRequest = FetchResolvedPhotoUriRequest.builder(photoMetadata) .setMaxWidth(500) // Optional. .setMaxHeight(300) // Optional. .build(); // Request the photo URI placesClient.fetchResolvedPhotoUri(photoRequest).addOnSuccessListener((fetchResolvedPhotoUriResponse) -> { Uri uri = fetchResolvedPhotoUriResponse.getUri(); RequestOptions requestOptions = new RequestOptions().override(Target.SIZE_ORIGINAL); Glide.with(this).load(uri).apply(requestOptions).into(imageView); }).addOnFailureListener((exception) -> { if (exception instanceof ApiException) { final ApiException apiException = (ApiException) exception; Log.e(TAG, "Place not found: " + exception.getMessage()); final int statusCode = apiException.getStatusCode(); // TODO: Handle error with given status code. } }); });
Atribuciones
En la mayoría de los casos, las fotos de lugares se pueden usar sin atribución, o tendrán la atribución requerida incluida como parte de la imagen. Sin embargo, el objeto de metadatos de la foto, del tipo PhotoMetadata
, puede contener cualquiera de los dos tipos de atribuciones adicionales:
- Atribuciones: Es una cadena de atribución a la que accede
PhotoMetadata.getAttributions()
. - AuthorAttributions, un objeto
AuthorAttributions
al que accedePhotoMetadata.getAuthorAttributions()
.
Si el objeto PhotoMetadata
que se muestra incluye cualquier tipo de atribución, debes incluirla en tu aplicación en cualquier lugar donde muestres la imagen. Para obtener más información, consulta Muestra las atribuciones.
Uso y facturación
Se cobra un SKU Places Photo por cada llamada a fetchPhoto()
.
Consulta la página Uso y facturación para obtener más detalles.