Luogo attuale

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.
Seleziona piattaforma: Android iOS

Utilizzando l'SDK Places per Android, puoi trovare il luogo attuale nella posizione segnalata dal dispositivo. Esempi di luoghi includono attività locali, punti di interesse e posizioni geografiche.

Autorizzazioni

Per utilizzare la libreria, non è necessario dichiarare alcuna autorizzazione aggiuntiva nel file manifest dell'app, poiché 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 durante il 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 considera l'utilizzo di EasyPermissions per iniziare.

Individuare la posizione attuale

Per trovare l'attività locale o l'altro luogo in cui si trova il dispositivo, procedi nel seguente modo:

  1. Chiama ContextCompat.checkSelfPermission per verificare se l'utente ha concesso l'autorizzazione ad accedere alla posizione del suo dispositivo. Inoltre l'app deve includere codice per richiedere l'autorizzazione dell'utente e gestire il risultato. Consulta Richiedi autorizzazioni app per i dettagli.
  2. Crea una proprietà FindCurrentPlaceRequest, passando un List di Place.Field, specificando i tipi di dati dei luoghi che la tua app deve richiedere.
  3. Chiama il numero PlacesClient.findCurrentPlace(), passando il FindCurrentPlaceRequest creato nel passaggio precedente.
  4. Scarica l'elenco di PlaceLikelihood da FindCurrentPlaceResponse.

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 vengono fatturati alla tariffa di base e non comportano costi aggiuntivi. I campi Contatto e Ambiente sono fatturati a una tariffa superiore. Per maggiori informazioni sulle modalità di fatturazione delle richieste di dati dei luoghi, 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 probabilmente si trova il dispositivo. Per ogni luogo, il risultato include un'indicazione della probabilità che il luogo sia giusto. L'elenco potrebbe essere vuoto se non esiste una posizione nota corrispondente alla posizione del dispositivo specificata.

Puoi chiamare PlaceLikelihood.getPlace() per recuperare un oggetto Place 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.

L'esempio di codice riportato di seguito recupera l'elenco dei luoghi 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 che il luogo sia la migliore corrispondenza nell'elenco dei luoghi restituiti per una singola richiesta. Non puoi confrontare le probabilità tra diverse richieste.
  • Il valore di 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.

Attribuzioni display nell'app

Quando la tua app mostra informazioni ottenute da PlacesClient.findCurrentPlace(), deve mostrare anche le attribuzioni. Consulta la documentazione sulle attribuzione.