Current Place (heredado)

Desarrolladores del Espacio Económico Europeo (EEE)

Con el SDK de Places para Android, puedes descubrir el lugar en la ubicación que se informa actualmente para el dispositivo. Algunos ejemplos de lugares son las empresas locales, los lugares de interés y las ubicaciones geográficas.

Permisos

Para usar la biblioteca, no necesitas declarar ningún permiso adicional 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 los permisos ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION que introduce la biblioteca. Para ello, agrega 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>

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 o cualquier otro lugar en el que se encuentre el dispositivo, sigue estos pasos:

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

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 datos básicos se facturan con la tarifa base y no generan cargos adicionales. Los campos de datos de contacto y atmosféricos se facturan con una tarifa más alta. Si deseas consultar más detalles sobre cómo se facturan las solicitudes de datos de Places, consulta Uso y facturación.

La API devuelve un objeto FindCurrentPlaceResponse en un objeto Task. FindCurrentPlaceResponse contiene una lista de objetos PlaceLikelihood que representan lugares en los que es probable que se encuentre el dispositivo. Para cada lugar, el resultado incluye una indicación de la probabilidad de que el lugar sea el correcto. La lista puede estar vacía si no hay ningún lugar conocido que corresponda a la ubicación 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 la siguiente muestra de código, se recupera la lista de lugares en los que es más probable que se encuentre el dispositivo y se registran el nombre y la probabilidad de cada lugar.

Kotlin

// Use fields to define the data types to return.
val placeFields = listOf(Place.Field.DISPLAY_NAME, Place.Field.FORMATTED_ADDRESS, Place.Field.LOCATION)

// Define the search area around the current location (500m radius).
val currentLocation = LatLng(37.4220, -122.0841)
val circle = CircularBounds.newInstance(currentLocation, 500.0)
val request = SearchNearbyRequest.builder(circle, placeFields)
    .setMaxResultCount(20)
    .build()

// Call searchNearby and handle the response (first check that the user has granted permission).
if (ContextCompat.checkSelfPermission(this, permission.ACCESS_FINE_LOCATION) ==
    PackageManager.PERMISSION_GRANTED
) {
    placesClient.searchNearby(request).addOnSuccessListener { response ->
        binding.progressBar.visibility = View.GONE
        adapter.setPlaces(response.places)
    }.addOnFailureListener { exception ->
        binding.progressBar.visibility = View.GONE
        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 =
        Arrays.asList(
                Place.Field.DISPLAY_NAME,
                Place.Field.FORMATTED_ADDRESS,
                Place.Field.LOCATION);

// Define the search area around the current location.
LatLng currentLocation = new LatLng(37.4220, -122.0841);
LocationRestriction circle =
        CircularBounds.newInstance(currentLocation, /* radius= */ 500.0);

// Use the builder to create a SearchNearbyRequest.
SearchNearbyRequest request =
        SearchNearbyRequest.builder(circle, placeFields).setMaxResultCount(20).build();

// Call searchNearby and handle the response (first check that the user has granted
// permission).
if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)
        == PackageManager.PERMISSION_GRANTED) {
    Task<SearchNearbyResponse> placeResponse = placesClient.searchNearby(request);
    placeResponse.addOnCompleteListener(
            task -> {
                binding.progressBar.setVisibility(View.GONE);
                if (task.isSuccessful()) {
                    SearchNearbyResponse response = task.getResult();
                    adapter.setPlaces(response.getPlaces());
                } else {
                    Exception exception = task.getException();
                    if (exception instanceof ApiException apiException) {
                        Log.e(
                                "CurrentPlace",
                                "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 de que el lugar sea la mejor coincidencia dentro de la lista de lugares que se muestran para una sola solicitud. 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 lugar A y una probabilidad del 35% de que sea el lugar B, la respuesta tiene dos miembros: el lugar A con una probabilidad de 0.55 y el lugar 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.