Con el SDK de Places para Android, puedes descubrir el lugar en el ubicación informada actualmente del dispositivo. Algunos ejemplos de lugares son locales como empresas, lugares de interés y ubicaciones geográficas.
Permisos
Para usar la biblioteca, no es necesario declarar permisos adicionales en el manifiesto de tu app.
ya que la biblioteca 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 elemento
Se agregaron los permisos ACCESS_FINE_LOCATION
y ACCESS_COARSE_LOCATION
agregando lo siguiente a tu manifiesto:
<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>
Más información sobre permisos y considera usar EasyPermissions para comenzar.
Obtén la ubicación actual
Para encontrar la empresa local o cualquier otro lugar donde se encuentre el dispositivo sigue estos pasos:
- Llama a
ContextCompat.checkSelfPermission
para verificar si el usuario otorgó permiso para acceder a su dispositivo ubicación. Tu app también debe incluir código para solicitarle permiso al usuario. y manejar el resultado. Consulta Cómo solicitar permisos de la app. para conocer los detalles. - Crea un
FindCurrentPlaceRequest
. pasando unaList
dePlace.Field
, que especifica el tipos de datos de lugar que tu app debe solicitar. - Llamada a
PlacesClient.findCurrentPlace()
, pasando elFindCurrentPlaceRequest
que creaste en el paso. - Obtén la lista de objetos
PlaceLikelihood
de laFindCurrentPlaceResponse
Los campos corresponden a los resultados de Place Search y se dividen en tres categorías de facturación: Basic, Contact y Atmosphere. Los campos de la tarifa Basic se facturan con la tarifa base y no generan costos cargos. Los campos de datos de contacto y atmosféricos se facturan con una tarifa más alta. Más información sobre cómo se facturan las solicitudes de datos de Places, consulta Uso y Facturación.
La API devuelve un
FindCurrentPlaceResponse
en una
Task
FindCurrentPlaceResponse
contiene una lista de
PlaceLikelihood
objetos que representan lugares en los que es probable que se encuentre el dispositivo. Para
cada sitio, el resultado incluye una indicación de la probabilidad de que el
lugar es el correcto. La lista puede estar vacía si no se conoce ningún lugar.
correspondiente a la ubicación del dispositivo.
Puedes llamar
PlaceLikelihood.getPlace()
para recuperar un
Place
un objeto y
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.
La siguiente muestra de código recupera la lista de lugares donde se encuentra el dispositivo y registra el nombre y la probabilidad de cada lugar.
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(); }
Notas sobre los valores de la probabilidad:
- La probabilidad proporciona una probabilidad relativa que es la mejor coincidencia en la lista de lugares devueltos para una en una sola solicitud. No puedes comparar las probabilidades entre solicitudes diferentes.
- 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 y una probabilidad del 35% de que sea el lugar 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
Cuándo muestra la app información obtenida de
PlacesClient.findCurrentPlace()
:
la aplicación también debe mostrar atribuciones. Consulta la documentación sobre
atribuciones.