Local atual

Selecione a plataforma: Android iOS

Com o SDK do Places para Android, você pode descobrir o local no local informado no dispositivo no momento. Exemplos de lugares incluem empresas locais, pontos de interesse e localizações geográficas.

Permissões

Para usar a biblioteca, não é necessário declarar outras permissões no manifesto do app, já que a biblioteca declara todas as permissões usadas no manifesto. No entanto, se o app usa o PlacesClient.findCurrentPlace(), é necessário solicitar permissões de localização durante a execução.

Se o app não usa PlacesClient.findCurrentPlace(), remova explicitamente as permissões ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION introduzidas pela biblioteca adicionando o seguinte ao manifesto:

<manifest ... xmlns:tools="http://schemas.android.com/tools">
    ...
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove"/>
    ...
</manifest>

Leia mais sobre permissões e considere o uso de EasyPermissions para começar.

Obter localização atual

Para encontrar a empresa ou outro lugar em que o dispositivo está localizado atualmente, siga estas etapas:

  1. Chame ContextCompat.checkSelfPermission para verificar se o usuário concedeu permissão para acessar a localização do dispositivo. Seu app também precisa incluir um código para solicitar a permissão do usuário e processar o resultado. Consulte Solicitar permissões do app para mais detalhes.
  2. Crie um FindCurrentPlaceRequest, transmitindo um List de Place.Fields, especificando os tipos de dados de lugar que seu app vai solicitar.
  3. Chame PlacesClient.findCurrentPlace(), transmitindo o FindCurrentPlaceRequest que você criou na etapa anterior.
  4. Acessa a lista de PlaceLikelihoods da FindCurrentPlaceResponse.

Os campos correspondem aos resultados do Place Search e são divididos em três categorias de faturamento: "Basic", "Contact" e "Atmosphere". Os campos "Basic" são faturados na taxa básica e não geram cobranças extras. Os campos "Contact" e "Atmosphere" são faturados em uma taxa maior. Para mais informações sobre como as solicitações de dados de lugar são faturadas, consulte Uso e faturamento.

A API retorna um FindCurrentPlaceResponse em um Task. A FindCurrentPlaceResponse contém uma lista de objetos PlaceLikelihood que representam lugares em que o dispositivo provavelmente está. Para cada lugar, o resultado inclui uma indicação da probabilidade de ele ser o correto. A lista pode estar vazia se não houver um lugar conhecido correspondente ao local do dispositivo especificado.

Você pode chamar PlaceLikelihood.getPlace() para recuperar um objeto Place e PlaceLikelihood.getLikelihood() para ver a classificação de probabilidade do lugar. Quanto maior o valor, maior a probabilidade de que o lugar seja a melhor correspondência.

O exemplo de código a seguir recupera a lista de locais em que o dispositivo provavelmente está localizado e registra o nome e a probabilidade de cada um.

Kotlin



// Use fields to define the data types to return.
val placeFields: List<Place.Field> = listOf(Place.Field.NAME)

// Use the builder to create a FindCurrentPlaceRequest.
val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)

// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) ==
    PackageManager.PERMISSION_GRANTED) {

    val placeResponse = placesClient.findCurrentPlace(request)
    placeResponse.addOnCompleteListener { task ->
        if (task.isSuccessful) {
            val response = task.result
            for (placeLikelihood: PlaceLikelihood in response?.placeLikelihoods ?: emptyList()) {
                Log.i(
                    TAG,
                    "Place '${placeLikelihood.place.name}' has likelihood: ${placeLikelihood.likelihood}"
                )
            }
        } else {
            val exception = task.exception
            if (exception is ApiException) {
                Log.e(TAG, "Place not found: ${exception.statusCode}")
            }
        }
    }
} else {
    // A local method to request required permissions;
    // See https://developer.android.com/training/permissions/requesting
    getLocationPermission()
}

      

Java


// Use fields to define the data types to return.
List<Place.Field> placeFields = Collections.singletonList(Place.Field.NAME);

// Use the builder to create a FindCurrentPlaceRequest.
FindCurrentPlaceRequest request = FindCurrentPlaceRequest.newInstance(placeFields);

// Call findCurrentPlace and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    Task<FindCurrentPlaceResponse> placeResponse = placesClient.findCurrentPlace(request);
    placeResponse.addOnCompleteListener(task -> {
        if (task.isSuccessful()){
            FindCurrentPlaceResponse response = task.getResult();
            for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                Log.i(TAG, String.format("Place '%s' has likelihood: %f",
                    placeLikelihood.getPlace().getName(),
                    placeLikelihood.getLikelihood()));
            }
        } else {
            Exception exception = task.getException();
            if (exception instanceof ApiException) {
                ApiException apiException = (ApiException) exception;
                Log.e(TAG, "Place not found: " + apiException.getStatusCode());
            }
        }
    });
} else {
    // A local method to request required permissions;
    // See https://developer.android.com/training/permissions/requesting
    getLocationPermission();
}

      

Observações sobre os valores de probabilidade:

  • Ela fornece a probabilidade relativa de o local ser a melhor correspondência dentro da lista de locais retornados para uma única solicitação. Não é possível comparar probabilidades em solicitações diferentes.
  • O valor da probabilidade estará entre 0,0 e 1,0.

Por exemplo, para representar uma probabilidade de 55% de que o lugar correto seja o Local A e uma probabilidade de 35% de que seja o Local B, a resposta terá dois membros, Local A com uma probabilidade de 0,55 e Local B com uma probabilidade de 0,35.

Exibir atribuições no seu aplicativo

Quando seu app exibe informações recebidas de PlacesClient.findCurrentPlace(), ele também precisa exibir atribuições. Consulte a documentação sobre atribuições.