Die Geospatial API verwendet eine Kombination aus VPS- und GPS-Daten, um präzise raumbezogene Posen zu erstellen. Die API kann überall verwendet werden, wo das Gerät seinen Standort ermitteln kann:
- In Gebieten mit geringer GPS-Genauigkeit, z. B. in Innenräumen und dicht bebauten Städten, setzt die API auf eine VPS-Abdeckung, um Positionen mit hoher Genauigkeit zu erzeugen.
- In Umgebungen im Freien mit wenigen oder gar keinen Hindernissen über dem Kopf kann die Geospatial API die verfügbaren GPS-Standortdaten verwenden, um raumbezogene Posen mit hoher Genauigkeit zu erstellen.
Sie können die Verfügbarkeit von VPS an einer bestimmten horizontalen Position ermitteln, bevor die AR-Sitzung beginnt, und sie verwenden, um spezifischere Funktionen zu erstellen, z. B. um die Schaltfläche „AR aktivieren“ nur dann einzublenden, wenn VPS verfügbar ist.
ARCore API aktivieren
Ihre App muss die ARCore API aktivieren, um die Verfügbarkeit von VPS zu prüfen.
Sobald die ARCore API aktiviert ist, können Sie die Verfügbarkeit von VPS ohne Folgendes prüfen:
- Ein aktuell ausgeführter
ArSession
(vor dem Aufrufen vonArSession_resume()
). - Ein
ArGeospatialMode
festlegen.
Verfügbarkeit von VPS in Ihrer App prüfen
Die Geospatial API kann überall verwendet werden, wo das Gerät seinen Standort ermitteln kann. Wenn Ihre AR-Nutzung von der VPS-Abdeckung abhängt, können Sie ArSession_checkVpsAvailabilityAsync()
verwenden, um eine ArVpsAvailabilityFuture
zu erhalten. Das ist eine asynchrone Aufgabe, die die VPS-Verfügbarkeit an einer bestimmten horizontalen Position prüft.
Sobald Sie die ArVpsAvailabilityFuture
haben, können Sie das Ergebnis durch Abfragen oder über einen Callback abrufen.
Ergebnis abfragen
Verwenden Sie ArFuture_getState()
, um den Status von ArFuture
abzurufen. Es gibt drei verschiedene Status:
AR_FUTURE_STATE_PENDING
: Der Vorgang ist noch nicht abgeschlossen, sodass kein Ergebnis bekannt ist.AR_FUTURE_STATE_CANCELLED
: Der Vorgang wurde vonArFuture_cancel()
abgebrochen. Registrierte Callbacks werden nie aufgerufen.AR_FUTURE_STATE_DONE
: Der Vorgang ist abgeschlossen. Verwenden SieArVpsAvailabilityFuture_getResult()
, um das Ergebnis abzurufen.
Sie können die Suche in ArFuture_getState()
fortsetzen, bis die Aufgabe abgeschlossen ist.
// 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); }
Ergebnis über einen Callback abrufen
Sie können das Ergebnis eines ArFuture
auch über einen Callback abrufen. Verwenden Sie ArSession_checkVpsAvailabilityAsync()
und geben Sie eine callback
an. Diese callback
wird im Main-Thread aufgerufen, kurz nachdem ArFuture
den Status AR_FUTURE_STATE_DONE
hat.
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); }
ArFuture
abbrechen
Versuchen Sie mit ArFuture_cancel()
, ArFuture
abzubrechen. Aufgrund der Threadparallelität ist es möglich, dass Ihr Abbruchversuch nicht erfolgreich ist.
ArFuture_cancel()
gibt 1
zurück, wenn dieser Versuch erfolgreich war, andernfalls 0
.
Geospatial API ohne VPS-Abdeckung verwenden
Die Geospatial API kann auch in Regionen verwendet werden, in denen keine VPS-Abdeckung vorliegt. In Außenbereichen mit wenigen oder gar keinen Hindernissen über dem Kopf reicht das GPS unter Umständen aus, um eine Position mit hoher Genauigkeit zu erstellen.
Nächste Schritte
- Räumliche Position der Gerätekamera festlegen, um den genauen Standort des Geräts in der realen Welt zu bestimmen