Local atual

Com o SDK do Places para Android, você pode descobrir o local no lugar informado do dispositivo. Exemplos de lugares incluem empresas locais, pontos de interesse e locais geográficos.

Permissões

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

Se o app não usar 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 usar o EasyPermissions para começar.

Obter localização atual

Para encontrar a empresa local ou outro lugar onde o dispositivo está localizado, 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 permissão ao usuário e processar o resultado. Consulte Solicitar permissões do app para mais detalhes.
  2. Crie uma FindCurrentPlaceRequest, transmitindo um List de Place.Fields, especificando os tipos de dados de lugar que seu app precisa solicitar.
  3. Chame PlacesClient.findCurrentPlace(), transmitindo o FindCurrentPlaceRequest que você criou na etapa anterior.
  4. Confira a lista de PlaceLikelihoods do FindCurrentPlaceResponse.

Os campos correspondem aos resultados da pesquisa de lugares e são divididos em três categorias de faturamento: "Basic", "Contact" e "Atmosphere". Os campos básicos 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. O FindCurrentPlaceResponse contém uma lista de objetos PlaceLikelihood que representam os lugares em que o dispositivo provavelmente está localizado. Para cada lugar, o resultado inclui uma indicação da probabilidade de que o lugar seja o certo. A lista pode estar vazia se não houver um lugar conhecido correspondente à localização do dispositivo.

É possível chamar PlaceLikelihood.getPlace() para extrair um objeto Place e PlaceLikelihood.getLikelihood() para receber 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 abaixo recupera a lista de lugares em que o dispositivo tem mais probabilidade de estar localizado e registra o nome e a probabilidade de cada lugar.

// 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()
}

      
// 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:

  • A probabilidade fornece uma probabilidade relativa de o lugar ser a melhor correspondência na lista de lugares retornados para uma única solicitação. Não é possível comparar as probabilidades entre diferentes solicitações.
  • O valor da probabilidade vai estar entre 0,0 e 1,0.

Por exemplo, para representar uma probabilidade de 55% de que o lugar correto é o A e uma probabilidade de 35% de que é o B, a resposta tem dois membros: o lugar A com uma probabilidade de 0, 55 e o lugar B com uma probabilidade de 0,35.

Exibir atribuições no seu aplicativo

Quando o app mostra informações obtidas de PlacesClient.findCurrentPlace(), ele também precisa mostrar as atribuições. Consulte a documentação sobre atribuições.