Place Photos

Selecciona la plataforma: Android iOS JavaScript Servicio web

Puedes usar el SDK de Places para Android a fin de solicitar que se muestre una foto de un lugar en tu aplicación. Las fotos que muestra el servicio de fotos provienen de varias fuentes, como propietarios de empresas y fotos aportadas por los usuarios. Para recuperar la imagen de un sitio, debes seguir estos pasos:

  1. Usa Place Details para recuperar un objeto Place (usa fetchPlace() o findCurrentPlace()). Asegúrate de incluir el campo Place.Field PHOTO_METADATAS en la lista de campos que se incluirán en el objeto Place de respuesta.
  2. En el OnSuccessListener de tu FetchPlaceResponse o FindCurrentPlaceResponse, haz lo siguiente:
    1. Usa Place.getPhotoMetadas() para obtener el objeto de metadatos de la foto, de tipo PhotoMetadata, del objeto Place de respuesta.
    2. 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.
    3. Usa PlacesClient.fetchPhoto() para solicitar la foto.
    4. Agrega un elemento OnSuccessListener y obtén la foto del objeto FetchPhotoResponse.

Acceder a los datos de PhotoMetadata agregados en la versión 3.3.0

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 alguna atribución, ya sea las nuevas atribuciones del autor agregadas en la versión 3.3.0 o las existentes disponibles en la versión 3.2.0 y anteriores, debes mostrarlas con la foto. Para obtener más información sobre cómo manejar todos los tipos de atribuciones, consulta Atribuciones.

Para propagar el objeto PhotoMetadata con atribuciones del autor, debes hacer lo siguiente:

  1. Habilita el SDK nuevo cuando configures tu proyecto de Google Cloud.
  2. Inicializa el SDK nuevo dentro de una actividad o un fragmento.
  3. Incluye el Place.Field.PHOTO_METADATAS en la lista de campos de la solicitud de detalles del lugar.
  4. Llama a PlacesClient.fetchPlace() para obtener el objeto Place y a Place.getPhotoMetadas() para obtener el objeto PhotoMetadata. El campo de atribuciones del autor no es compatible con PlacesClient.findCurrentPlace().
  5. Usa PhotoMetadata.getAuthorAttributions() para obtener atribuciones del autor.

Obtén una foto de un lugar

En el siguiente ejemplo, se muestra cómo obtener una foto de un lugar.

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

      

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 estos dos tipos de atribuciones adicionales:

Si el objeto PhotoMetadata que se muestra incluye cualquier tipo de atribución, debes incluir la atribución en tu aplicación en cualquier lugar donde muestres la imagen. Para obtener más información, consulta Muestra atribuciones.

Uso y facturación

Se cobra un SKU Places Photo por cada llamada que se realice a fetchPhoto(). Consulta la página Uso y facturación para obtener más detalles.