Utilizzando Places SDK for Android, puoi scoprire il luogo nella posizione attualmente segnalata dal dispositivo. Esempi di luoghi sono attività locali, punti d'interesse e posizioni geografiche.
Autorizzazioni
Per utilizzare la libreria non è necessario dichiarare altre autorizzazioni nel file manifest dell'app,
poiché la libreria dichiara tutte le autorizzazioni che utilizza nel proprio file manifest. Tuttavia, se la tua app utilizza
PlacesClient.findCurrentPlace(),
devi richiedere le autorizzazioni di accesso alla posizione
in fase di runtime.
Se la tua app non utilizza PlacesClient.findCurrentPlace(), rimuovi esplicitamente le autorizzazioni ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION introdotte dalla libreria aggiungendo quanto segue al manifest:
<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>
Scopri di più sulle autorizzazioni e valuta la possibilità di utilizzare EasyPermissions per iniziare.
Ottieni la posizione attuale
Per trovare l'attività locale o un altro luogo in cui si trova attualmente il dispositivo, segui questi passaggi:
- Chiama
ContextCompat.checkSelfPermissionper verificare se l'utente ha concesso l'autorizzazione ad accedere alla posizione del dispositivo. L'app deve inoltre includere il codice per richiedere l'autorizzazione all'utente e per gestire il risultato. Per maggiori dettagli, consulta Richiedi autorizzazioni app. - Crea un
FindCurrentPlaceRequest, passando unListdiPlace.Field, specificando i tipi di dati dei luoghi che l'app deve richiedere. - Chiama
PlacesClient.findCurrentPlace(), passando l'oggettoFindCurrentPlaceRequestche hai creato nel passaggio precedente. - Recupera l'elenco di
PlaceLikelihooddaFindCurrentPlaceResponse.
I campi corrispondono ai risultati di Place Search e sono suddivisi in tre categorie di fatturazione: Basic, Contact e Atmosphere. I campi di base vengono fatturati alla tariffa base e non comportano costi aggiuntivi. I campi Contact e Atmosphere vengono fatturati a una tariffa più elevata. Per ulteriori informazioni sulla fatturazione delle richieste di dati di Place, consulta Utilizzo e fatturazione.
L'API restituisce un
FindCurrentPlaceResponse
in un
Task.
FindCurrentPlaceResponse contiene un elenco di oggetti PlaceLikelihood che rappresentano i luoghi in cui è probabile che si trovi il dispositivo. Per ogni luogo, il risultato include un'indicazione della probabilità che il luogo sia quello giusto. L'elenco potrebbe essere vuoto se non esiste un luogo noto corrispondente alla posizione del dispositivo specificata.
Puoi chiamare PlaceLikelihood.getPlace() per recuperare un oggetto Place e PlaceLikelihood.getLikelihood() per ottenere la valutazione della probabilità del luogo. Un valore più alto indica una maggiore probabilità che il luogo sia la corrispondenza migliore.
Il seguente esempio di codice recupera l'elenco dei luoghi in cui è più probabile che si trovi il dispositivo e registra il nome e la probabilità di ciascun luogo.
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(); }
Note sui valori di probabilità:
- La probabilità fornisce una probabilità relativa che il luogo sia la corrispondenza migliore nell'elenco dei luoghi restituiti per una singola richiesta. Non puoi confrontare le probabilità tra richieste diverse.
- Il valore della probabilità sarà compreso tra 0,0 e 1,0.
Ad esempio, per rappresentare una probabilità del 55% che il luogo corretto sia il luogo A e una probabilità del 35% che sia il luogo B, la risposta ha due membri, il luogo A con una probabilità di 0,55 e il luogo B con una probabilità di 0,35.
Visualizza le attribuzioni nella tua app
Quando la tua app mostra informazioni ottenute da PlacesClient.findCurrentPlace(), deve mostrare anche le attribuzioni. Consulta la documentazione sulle attribuzioni.