Current Place

Seleccionar plataforma: Android iOS

Con el SDK de Places para Android, puedes descubrir el lugar en la ubicación actual del dispositivo. Algunos ejemplos de lugares incluyen empresas locales, lugares de interés y ubicaciones geográficas.

Permisos

Para usar la biblioteca, no necesitas declarar ningún permiso adicional en el manifiesto de tu app, ya que esta declara todos los permisos que usa en su manifiesto. Sin embargo, si tu app usa PlacesClient.findCurrentPlace(), debes solicitar permisos de ubicación durante el tiempo de ejecución.

Si tu app no usa PlacesClient.findCurrentPlace(), quita explícitamente el permiso ACCESS_FINE_LOCATION que ingresa la biblioteca. Para ello, agrega lo siguiente al manifiesto:

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

Obtén más información sobre los permisos y considera usar EasyPermissions para comenzar.

Obtén la ubicación actual

Para encontrar la empresa local u otro lugar en el que se encuentre actualmente el dispositivo, sigue estos pasos:

  1. Llama a ContextCompat.checkSelfPermission a fin de verificar si el usuario otorgó permiso para acceder a la ubicación de su dispositivo. Tu app también debe incluir código para solicitar permiso al usuario y administrar el resultado. Consulta Cómo solicitar permisos de la app para obtener más detalles.
  2. Crea un FindCurrentPlaceRequest y pasa un List de Place.Field y especifica los tipos de datos de lugar que tu app debe solicitar.
  3. Llama a PlacesClient.findCurrentPlace() y pasa el FindCurrentPlaceRequest que creaste en el paso anterior.
  4. Obtén la lista de PlaceLikelihood de FindCurrentPlaceResponse.

Los campos corresponden a los resultados de la búsqueda de un lugar y se dividen en tres categorías de facturación: Basic, Contact y Atmosphere. Los campos básicos se facturan con la tarifa base y no generan cargos adicionales. Los campos Contacto y Atmósfera se facturan con una tarifa más alta. Para obtener más información sobre cómo se facturan las solicitudes de datos de sitios, consulta Uso y facturación.

La API muestra un FindCurrentPlaceResponse en un Task. FindCurrentPlaceResponse contiene una lista de objetos PlaceLikelihood que representan lugares donde es probable que se encuentre el dispositivo. Para cada lugar, el resultado incluye una indicación de la probabilidad de que el sitio sea el correcto. La lista puede estar vacía si no existe un lugar conocido que corresponda a la ubicación determinada del dispositivo.

Puedes llamar a PlaceLikelihood.getPlace() para recuperar un objeto Place y a PlaceLikelihood.getLikelihood() para obtener la calificación de probabilidad del lugar. Un valor más alto significa una mayor probabilidad de que el lugar sea la mejor coincidencia.

En el siguiente ejemplo de código, se recupera la lista de lugares donde es más probable que se encuentre el dispositivo y se registra el nombre y la probabilidad para cada lugar.

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

      

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

      

Notas sobre los valores de la probabilidad:

  • La probabilidad proporciona una probabilidad relativa de que el sitio sea la mejor coincidencia dentro de la lista de sitios mostrados para una solicitud individual. No puedes comparar las probabilidades entre diferentes solicitudes.
  • El valor de la probabilidad estará entre 0.0 y 1.0.

Por ejemplo, para representar una probabilidad del 55% de que el lugar correcto sea el Sitio A, y una probabilidad del 35% de que sea el Sitio B, la respuesta tiene dos miembros, el Sitio A con una probabilidad de 0.55 y el Sitio B con una probabilidad de 0.35.

Mostrar atribuciones en tu aplicación

Cuando tu app muestra información obtenida de PlacesClient.findCurrentPlace(), también debe mostrar atribuciones. Consulta la documentación sobre las atribuciones.