Utilizzando l'SDK Places per Android, puoi trovare il luogo nella posizione attuale del dispositivo. I luoghi di interesse includono attività locali, punti di interesse e località geografiche.
Autorizzazioni
Per utilizzare la libreria, non è necessario dichiarare alcuna autorizzazione aggiuntiva nel file manifest dell'app, in quanto la libreria dichiara tutte le autorizzazioni che utilizza nel file manifest. Tuttavia, se la tua app utilizza
PlacesClient.findCurrentPlace()
,
devi richiedere le autorizzazioni di accesso alla posizione in fase di esecuzione.
Se la tua app non usa PlacesClient.findCurrentPlace()
, rimuovi esplicitamente le autorizzazioni ACCESS_FINE_LOCATION
e ACCESS_COARSE_LOCATION
introdotte dalla libreria aggiungendo quanto segue al file 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.
Trova la posizione attuale
Per trovare l'attività locale o altro luogo in cui si trova attualmente il dispositivo, segui questi passaggi:
- Chiama
ContextCompat.checkSelfPermission
per verificare se l'utente ha concesso l'autorizzazione ad accedere alla posizione del suo dispositivo. L'app deve includere anche il codice per richiedere l'autorizzazione e gestire il risultato. Per informazioni dettagliate, consulta la pagina Richiedere autorizzazioni app. - Crea un elemento
FindCurrentPlaceRequest
, passando un valore diList
perPlace.Field
, specificando i tipi di dati relativi alla posizione che la tua app deve richiedere. - Chiama
PlacesClient.findCurrentPlace()
, superando il passaggioFindCurrentPlaceRequest
che hai creato nel passaggio precedente. - Scarica l'elenco di
PlaceLikelihood
daFindCurrentPlaceResponse
.
I campi corrispondono ai risultati della Ricerca di luoghi e sono suddivisi in tre categorie di fatturazione: Di base, Contatto e Ambiente. I campi di base sono fatturati alla tariffa di base e non comportano costi aggiuntivi. I campi Contatto e Ambiente sono fatturati a una tariffa superiore. Per ulteriori informazioni sulla fatturazione delle richieste di dati dei luoghi, consulta Utilizzo e fatturazione.
L'API restituisce un
FindCurrentPlaceResponse
in
Task
.
FindCurrentPlaceResponse
contiene un elenco di oggetti PlaceLikelihood
che rappresentano i luoghi in cui probabilmente si trova 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.
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 corrisponda meglio.
L'esempio di codice riportato di seguito recupera l'elenco delle posizioni in cui è più probabile che il dispositivo si trovi e registra il nome e la probabilità di ciascun luogo.
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() }
Note sui valori di probabilità:
- La probabilità fornisce una probabilità relativa del luogo che rappresenta la corrispondenza migliore nell'elenco di luoghi restituiti per una singola richiesta. Non puoi confrontare le probabilità tra diverse richieste.
- 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 un 35% della probabilità 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.
Attribuzioni display nella tua app
Quando per la tua app vengono mostrate informazioni ottenute da
PlacesClient.findCurrentPlace()
,
devono essere visualizzate anche le attribuzioni. Consulta la documentazione sulle attribuzione.