Utilizzando Places SDK for Android, puoi scoprire il luogo in cui si trova attualmente il dispositivo. Alcuni esempi di luoghi sono attività locali, punti d'interesse e posizioni geografiche.
Autorizzazioni
Per utilizzare la libreria non è necessario dichiarare autorizzazioni aggiuntive nel file manifest dell'app,
in quanto 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 localizzazione
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 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.
Ottieni la posizione attuale
Per trovare l'attività locale o un altro luogo in cui si trova attualmente il dispositivo, segui questi passaggi:
- Chiama il numero
ContextCompat.checkSelfPermission
per verificare se l'utente ha concesso l'autorizzazione ad accedere alla posizione del dispositivo. L'app deve includere anche il codice per richiedere l'autorizzazione all'utente e per gestire il risultato. Per maggiori dettagli, consulta l'articolo Richiedere le autorizzazioni app. - Crea un
FindCurrentPlaceRequest
, passando unList
diPlace.Field
, specificando i tipi di dati sui luoghi che la tua app deve richiedere. - Chiama
PlacesClient.findCurrentPlace()
, passandoFindCurrentPlaceRequest
che hai creato nel passaggio precedente. - Recupera l'elenco di
PlaceLikelihood
daFindCurrentPlaceResponse
.
I campi corrispondono ai risultati della ricerca di luoghi e sono suddivisi in tre categorie di fatturazione: Basic, Contact e Atmosphere. I campi di base vengono fatturati alla tariffa base e non comportano addebiti aggiuntivi. I campi Contatto e Atmosfera vengono fatturati a una tariffa più elevata. Per ulteriori informazioni su come vengono fatturate le richieste di dati di Places, consulta Utilizzo e fatturazione.
L'API restituisce un
FindCurrentPlaceResponse
in un
Task
.
FindCurrentPlaceResponse
contiene un elenco di
PlaceLikelihood
oggetti che rappresentano i luoghi in cui è più 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
Place
oggetto e
PlaceLikelihood.getLikelihood()
per ottenere la valutazione di 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à per ciascun luogo.
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(); }
Note sui valori di probabilità:
- La probabilità fornisce una probabilità relativa che il luogo sia la migliore corrispondenza 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.
Visualizzare le attribuzioni nell'app
Quando la tua app mostra informazioni ottenute da
PlacesClient.findCurrentPlace()
,
deve mostrare anche le attribuzioni. Consulta la documentazione
sulle attribuzioni.