L'API Geospatial utilizza una combinazione di dati VPS e GPS per generare pose geospaziali ad alta precisione. L'API può essere utilizzata ovunque il dispositivo sia in grado di determinarne la posizione:
- Nelle aree con una scarsa precisione GPS, come gli spazi interni e gli ambienti urbani ad alta densità, l'API si baserà sulla copertura VPS per generare pose ad alta precisione.
- In ambienti esterni con poche ostruzioni aeree, l'API Geospatial potrebbe essere in grado di utilizzare i dati di posizione GPS disponibili per generare pose geospaziali con elevata precisione.
Puoi determinare la disponibilità del VPS in una determinata posizione orizzontale prima dell'inizio della sessione AR e utilizzarla per creare esperienze più specifiche, ad esempio per mostrare un pulsante "Accedi all'AR" solo quando il VPS è disponibile.
Attiva l'API ARCore
La tua app deve abilitare l'API ARCore per verificare la disponibilità dei server VPS.
Una volta abilitata l'API ARCore, puoi verificare la disponibilità dei server VPS senza:
- Un
ArSession
corrente in esecuzione (prima di chiamareArSession_resume()
). - Impostazione di un
ArGeospatialMode
.
Verificare la disponibilità del VPS nell'app
L'API Geospatial può essere utilizzata ovunque il dispositivo sia in grado di determinarne la posizione. Se la tua esperienza AR dipende dalla copertura dei VPS, puoi utilizzare ArSession_checkVpsAvailabilityAsync()
per ottenere un ArVpsAvailabilityFuture
, un'attività asincrona che controlla la disponibilità dei VPS in una determinata posizione orizzontale.
Una volta ottenuto il ArVpsAvailabilityFuture
, puoi ottenerne il risultato mediante un sondaggio o una richiamata.
Effettua il sondaggio sul risultato
Utilizza ArFuture_getState()
per ottenere lo stato di ArFuture
. Esistono tre stati diversi:
AR_FUTURE_STATE_PENDING
: l'operazione non è stata ancora completata, quindi non è noto alcun risultato.AR_FUTURE_STATE_CANCELLED
: l'operazione è stata annullata daArFuture_cancel()
. Qualsiasi callback registrato non verrà mai chiamato.AR_FUTURE_STATE_DONE
: l'operazione è completata. UtilizzaArVpsAvailabilityFuture_getResult()
per ottenere il risultato.
Puoi continuare a selezionare ArFuture_getState()
finché l'attività non è completata.
// Obtain a ArVpsAvailabilityFuture and store it somewhere. ArVpsAvailabilityFuture* future = NULL; CHECK(ArSession_checkVpsAvailabilityAsync(ar_session, latitude, longitude, NULL, NULL, &future) == AR_SUCCESS); // Poll ArVpsAvailabilityFuture later, for example, in a render loop. ArFutureState future_state = AR_FUTURE_STATE_PENDING; ArFuture_getState(ar_session, (ArFuture*)future, &future_state); if (future_state == AR_FUTURE_STATE_DONE) { ArVpsAvailability vps_availability = AR_VPS_AVAILABILITY_UNKNOWN; ArVpsAvailabilityFuture_getResult(ar_session, future, &vps_availability); switch (vps_availability) { case AR_VPS_AVAILABILITY_AVAILABLE: // VPS is available at this location. break; case AR_VPS_AVAILABILITY_UNAVAILABLE: // VPS is unavailable at this location. break; case AR_VPS_AVAILABILITY_ERROR_NETWORK_CONNECTION: // The external service could not be reached due to a network connection // error. break; // Handle other error states, e.g. // AR_VPS_AVAILABILITY_ERROR_RESOURCE_EXHAUSTED, // AR_VPS_AVAILABILITY_ERROR_INTERNAL, ... } ArFuture_release((ArFuture*)future); }
Ottenere il risultato tramite una chiamata di ritorno
Puoi anche ottenere il risultato di un ArFuture
tramite un callback. Utilizza ArSession_checkVpsAvailabilityAsync()
e fornisci un callback
. Questo callback
verrà chiamato nel thread principale poco dopo che ArFuture
avrà lo stato AR_FUTURE_STATE_DONE
.
void vps_availability_callback(void* context, ArVpsAvailability availability) { // Callback is called on the Main thread. // Handle the ArVpsAvailability result as shown above. // For example, show UI that enables your AR view. // It is a best practice to free `context` memory at the end of the callback. free(context); } void check_availability_with_callback(ArSession* ar_session, double latitude, double longitude) { ArVpsAvailabilityFuture* future = NULL; void* context = NULL; CHECK(ArSession_checkVpsAvailabilityAsync( ar_session, latitude, longitude, context, vps_availability_callback, &future) == AR_SUCCESS); }
Annullare l'ArFuture
Usa ArFuture_cancel()
per tentare di annullare l'ArFuture
. A causa del parallelismo dei thread, potrebbe essere possibile che il tentativo di annullamento non vada a buon fine.
ArFuture_cancel()
restituisce 1
se il tentativo è riuscito e 0
in caso contrario.
Usa l'API Geospatial senza copertura VPS
L'API Geospatial può essere utilizzata anche nelle aree che non hanno copertura VPS. In ambienti esterni con poche ostruzioni dall'alto o nessuna, il GPS può essere sufficiente per generare una posa con un'elevata precisione.
Passaggi successivi
- Ottenere la posizione geografica della fotocamera del dispositivo per determinare la posizione esatta del dispositivo dell'utente nel mondo reale.