Place Details

Selecione a plataforma: Android iOS JavaScript Web Service

O SDK Places para Android fornece ao seu app informações detalhadas sobre lugares, incluindo o nome e o endereço, a localização geográfica especificada como coordenadas de latitude/longitude, o tipo de lugar (por exemplo, boate, pet shop, museu) e muito mais. Para acessar essas informações em um lugar específico, use o ID de lugar, um identificador estável que identifica um lugar de forma exclusiva.

Detalhes do lugar

O objeto Place fornece informações sobre um lugar específico. É possível acessar um objeto Place das seguintes maneiras:

Ao solicitar um lugar, você precisa especificar quais dados do lugar serão retornados. Para fazer isso, transmita uma lista de valores de Place.Field que especifique os dados a serem retornados. Essa lista é uma consideração importante porque afeta o custo de cada solicitação.

Como os resultados de dados de lugar não podem ficar vazios, apenas aqueles que têm dados são retornados. Por exemplo, se um lugar solicitado não tiver fotos, o campo photos não vai estar presente no resultado.

O exemplo a seguir transmite uma lista de três valores de Place.Field para especificar os dados retornados por uma solicitação:

Kotlin

// Specify the fields to return.
val placeFields = listOf(Place.Field.NAME, Place.Field.RATING, Place.Field.OPENING_HOURS)

Java

// Specify the fields to return.
final List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME, Place.Field.RATING, Place.Field.OPENING_HOURS);
  

Acessar campos de dados de objetos do Place

Depois de receber o objeto Place, use os métodos dele para acessar os campos de dados especificados na solicitação. Se o campo não estiver no objeto Place, o método relacionado vai retornar nulo. Confira abaixo exemplos de alguns dos métodos disponíveis.

  • getAddress(): o endereço do lugar, em formato legível.
  • getAddressComponents(): uma List de componentes de endereço para esse lugar. Esses componentes são fornecidos para extrair informações estruturadas sobre o endereço de um lugar, por exemplo, encontrar a cidade em que ele está localizado. Não use esses componentes para formatar endereços. Em vez disso, chame getAddress(), que fornece um endereço formatado localizado.
  • getId(): o identificador textual do lugar. Leia mais sobre os IDs de lugar no restante desta página.
  • getLatLng(): a localização geográfica do lugar, especificada como coordenadas de latitude e longitude.
  • getName(): o nome do lugar.
  • getOpeningHours(): o OpeningHours do lugar. Chame OpeningHours.getWeekdayText() para retornar uma lista de strings que representam os horários de abertura e fechamento para cada dia da semana. Chame OpeningHours.getPeriods() para retornar uma lista de objetos period com informações mais detalhadas que sejam equivalentes aos dados fornecidos por getWeekdayText().

    O objeto Place também contém o método getCurrentOpeningHours(), que retorna os horários de funcionamento de um lugar nos próximos sete dias, e getSecondaryOpeningHours(), que retorna os horários secundários de funcionamento de um lugar nos próximos sete dias.

  • isOpen(): um booleano que indica se o lugar está aberto no momento. Se nenhum horário for especificado, o padrão será o horário atual. O isOpen só será retornado se Place.Field.UTC_OFFSET e Place.Field.OPENING_HOURS estiverem disponíveis. Para garantir resultados precisos, solicite os campos Place.Field.BUSINESS_STATUS e Place.Field.UTC_OFFSET na solicitação de lugar original. Se não for solicitado, será presumido que a empresa está operacional. Assista este vídeo para saber como usar isOpen com o Place Details.

Alguns exemplos:

Kotlin

val name = place.name
val address = place.address
val location = place.latLng

      

Java

final CharSequence name = place.getName();
final CharSequence address = place.getAddress();
final LatLng location = place.getLatLng();

      

Obter local por ID

O ID de lugar é um indicador textual que identifica um local de forma exclusiva. No SDK do Places para Android, é possível extrair o ID de um lugar chamando Place.getId(). O serviço Place Autocomplete também retorna um ID de lugar para cada lugar que corresponde à consulta de pesquisa e ao filtro fornecidos. Armazene o ID de lugar e use-o para recuperar o objeto Place novamente mais tarde.

Para receber um lugar por ID, chame PlacesClient.fetchPlace(), transmitindo um FetchPlaceRequest.

A API retorna um FetchPlaceResponse em um Task. O FetchPlaceResponse contém um objeto Place correspondente ao ID de lugar fornecido.

O exemplo de código a seguir mostra como chamar fetchPlace() para receber detalhes do lugar especificado.

Kotlin

// Define a Place ID.
val placeId = "INSERT_PLACE_ID_HERE"

// Specify the fields to return.
val placeFields = listOf(Place.Field.ID, Place.Field.NAME)

// Construct a request object, passing the place ID and fields array.
val request = FetchPlaceRequest.newInstance(placeId, placeFields)

placesClient.fetchPlace(request)
    .addOnSuccessListener { response: FetchPlaceResponse ->
        val place = response.place
        Log.i(PlaceDetailsActivity.TAG, "Place found: ${place.name}")
    }.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 the fields to return.
final List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME);

// Construct a request object, passing the place ID and fields array.
final FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields);

placesClient.fetchPlace(request).addOnSuccessListener((response) -> {
    Place place = response.getPlace();
    Log.i(TAG, "Place found: " + place.getName());
}).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.
    }
});

      

Receber status aberto

O método PlacesClient.isOpen(IsOpenRequest request) retorna um objeto IsOpenResponse indicando se o lugar está aberto no momento com base no horário especificado na chamada.

Esse método usa um único argumento do tipo IsOpenRequest que contém:

  • Um objeto Place ou uma string que especifica um ID de lugar.
  • Um valor de hora opcional que especifica o horário em milissegundos a partir de 1970-01-01T00:00:00Z. Se nenhum horário for especificado, o padrão será o horário atual.

Esse método exige que os seguintes campos existam no objeto Place:

  • Place.Field.BUSINESS_STATUS
  • Place.Field.CURRENT_OPENING_HOURS
  • Place.Field.OPENING_HOURS
  • Place.Field.UTC_OFFSET

Se esses campos não forem fornecidos no objeto Place ou se você transmitir um ID de lugar, o método vai usar PlacesClient.fetchPlace() para buscá-los. Para mais informações sobre como criar o objeto Place com os campos necessários, consulte Detalhes do lugar.

O exemplo a seguir determina se um lugar está aberto. Neste exemplo, você só transmite o ID do lugar para isOpen():

Kotlin

val isOpenCalendar: Calendar = Calendar.getInstance()
val placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk"

val request: IsOpenRequest = try {
    IsOpenRequest.newInstance(placeId, isOpenCalendar.timeInMillis)
} catch (e: IllegalArgumentException) {
    e.printStackTrace()
    return
}
val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(request)
isOpenTask.addOnSuccessListener { response ->
    val isOpen = response.isOpen
}
// ...

      

Java

@NonNull
Calendar isOpenCalendar = Calendar.getInstance();
String placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk";
IsOpenRequest isOpenRequest;

try {
    isOpenRequest = IsOpenRequest.newInstance(placeId, isOpenCalendar.getTimeInMillis());
} catch (IllegalArgumentException e) {
    e.printStackTrace();
    return;
}

Task<IsOpenResponse> placeTask = placesClient.isOpen(isOpenRequest);

placeTask.addOnSuccessListener(
        (response) ->
                isOpen = response.isOpen());
// ...

      

O próximo exemplo mostra como chamar isOpen(), em que você transmite um objeto Place. O objeto Place precisa conter um ID de lugar válido:

Kotlin

val isOpenCalendar: Calendar = Calendar.getInstance()
var place: Place
val placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk"
// Specify the required fields for an isOpen request.
val placeFields: List<Place.Field> = listOf(
    Place.Field.BUSINESS_STATUS,
    Place.Field.CURRENT_OPENING_HOURS,
    Place.Field.ID,
    Place.Field.OPENING_HOURS,
    Place.Field.UTC_OFFSET
)

val placeRequest: FetchPlaceRequest =
    FetchPlaceRequest.newInstance(placeId, placeFields)
val placeTask: Task<FetchPlaceResponse> = placesClient.fetchPlace(placeRequest)
placeTask.addOnSuccessListener { placeResponse ->
    place = placeResponse.place

    val isOpenRequest: IsOpenRequest = try {
        IsOpenRequest.newInstance(place, isOpenCalendar.timeInMillis)
    } catch (e: IllegalArgumentException) {
        e.printStackTrace()
        return@addOnSuccessListener
    }
    val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(isOpenRequest)
    isOpenTask.addOnSuccessListener { isOpenResponse ->
        val isOpen = isOpenResponse.isOpen
    }
    // ...
}
// ...

      

Java

@NonNull
Calendar isOpenCalendar = Calendar.getInstance();
String placeId = "ChIJD3uTd9hx5kcR1IQvGfr8dbk";
// Specify the required fields for an isOpen request.
List<Place.Field> placeFields = new ArrayList<>(Arrays.asList(
        Place.Field.BUSINESS_STATUS,
        Place.Field.CURRENT_OPENING_HOURS,
        Place.Field.ID,
        Place.Field.OPENING_HOURS,
        Place.Field.UTC_OFFSET
));

FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields);
Task<FetchPlaceResponse> placeTask = placesClient.fetchPlace(request);

placeTask.addOnSuccessListener(
        (placeResponse) -> {
            Place place = placeResponse.getPlace();
            IsOpenRequest isOpenRequest;

            try {
                isOpenRequest = IsOpenRequest.newInstance(place, isOpenCalendar.getTimeInMillis());
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
                return;
            }
            Task<IsOpenResponse> isOpenTask = placesClient.isOpen(isOpenRequest);

            isOpenTask.addOnSuccessListener(
                    (isOpenResponse) -> isOpen = isOpenResponse.isOpen());
            // ...
        });
// ...

      

Exibir atribuições no seu aplicativo

Quando o app mostra informações do local, incluindo avaliações, ele também precisa mostrar as atribuições. Para mais informações, consulte atribuições.

Mais informações sobre IDs de local

O ID de lugar usado no SDK do Places para Android é o mesmo identificador usado na API Places. Cada ID de lugar pode se referir a apenas um lugar, mas um único lugar pode ter mais de um ID. Há outras circunstâncias que podem fazer com que um lugar receba um novo ID. Isso pode acontecer, por exemplo, se uma empresa mudar para um novo local.

Ao solicitar um lugar especificando um ID, você pode ter certeza de que sempre vai receber o mesmo lugar na resposta (se ele ainda existir). No entanto, a resposta pode conter um ID de lugar diferente do que está na solicitação.

Para mais informações, consulte a visão geral do ID de lugar.