Sprawdź dostępność VPS w bieżącej lokalizacji urządzenia

Geospatial API korzysta z kombinacji danych VPS i danych GPS do generowania wysokiej dokładności pozycji geoprzestrzennych. Interfejsu API można używać w każdym miejscu, w którym urządzenie może określić swoje położenie:

  • W obszarach o niskiej dokładności GPS, takich jak wnętrza budynków i gęste obszary miejskie, interfejs API będzie korzystać z zasięgu VPS, aby generować pozy o wysokiej dokładności.
  • W środowiskach zewnętrznych z niewielką liczbą przeszkód nad głową interfejs Geospatial API może używać dostępnych danych o lokalizacji GPS, aby generować pozy geoprzestrzenne z dużą dokładnością.

Możesz określić dostępność VPS w danej pozycji poziomej przed rozpoczęciem sesji AR i wykorzystać ją do tworzenia bardziej szczegółowych doświadczeń, na przykład do pokazania opcji „Enter AR” (Tryb AR). tylko wtedy, gdy dostępny jest VPS.

Włącz interfejs ARCore API

Aby sprawdzić dostępność VPS, musisz włączyć w aplikacji ARCore API.

Po włączeniu ARCore API możesz sprawdzać dostępność VPS bez:

Sprawdzanie dostępności usługi VPS w aplikacji

Interfejsu Geospatial API można używać w dowolnym miejscu, w którym urządzenie może określić swoją lokalizację. Jeśli działanie AR zależy od pokrycia VPS, możesz użyć narzędzia ArSession_checkVpsAvailabilityAsync(), aby uzyskać ArVpsAvailabilityFuture – asynchroniczne zadanie, które sprawdza dostępność VPS w danej pozycji poziomej. Gdy już masz ArVpsAvailabilityFuture, możesz uzyskać wynik przez ankietę lub wywołanie zwrotne.

Wyniki ankiety

Użyj ArFuture_getState(), by uzyskać stan ArFuture. Istnieją 3 różne stany:

Możesz sprawdzać pole ArFuture_getState(), dopóki zadanie nie zostanie ukończone.

// 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);
}

Uzyskanie wyniku przez wywołanie zwrotne

Wynik wywołania ArFuture możesz też uzyskać za pomocą wywołania zwrotnego. Użyj aplikacji ArSession_checkVpsAvailabilityAsync() i podaj callback. Ta funkcja callback zostanie wywołana w wątku głównym wkrótce po tym, jak funkcja ArFuture otrzyma stan 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);
}

Anuluj ArFuture

Użyj adresu ArFuture_cancel(), aby anulować ArFuture. Z powodu równoległości wątków może się zdarzyć, że próba anulowania się nie powiedzie. Jeśli próba zakończyła się powodzeniem, funkcja ArFuture_cancel() zwraca wartość 1. W przeciwnym razie zwraca wartość 0.

Używaj interfejsu Geospatial API bez zasięgu VPS

Interfejsu Geospatial API można też używać na obszarach, które nie mają zasięgu VPS. W otoczeniu zewnętrznym z niewielkimi lub żadnymi przeszkodami z góry GPS może wystarczyć do wygenerowania pozy z wysoką dokładnością.

Co dalej?