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

Interfejs Geospatial API korzysta z kombinacji danych VPS i GPS, aby generować pozycje geoprzestrzenne o wysokiej dokładności. Interfejsu API można używać w dowolnym miejscu, w którym urządzenie może określić swoją lokalizację:

  • 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 usługi 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ć pozycje geoprzestrzenne z dużą dokładnością.

Przed rozpoczęciem sesji AR możesz określić dostępność VPS w danej pozycji poziomej i wykorzystać ją do tworzenia bardziej szczegółowych funkcji, np. wyświetlania przycisku „Wejdź do AR” tylko wtedy, gdy VPS jest dostępny.

Włącz interfejs ARCore API

Aby sprawdzić dostępność VPS, aplikacja musi mieć włączony interfejs ARCore API.

Po włączeniu interfejsu ARCore API możesz sprawdzić 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 korzystanie z AR zależy od zasięgu VPS, możesz użyć ArSession_checkVpsAvailabilityAsync(), aby uzyskać ArVpsAvailabilityFuture, czyli zadanie asynchroniczne, które sprawdza dostępność VPS w danej pozycji poziomej. Gdy masz ArVpsAvailabilityFuture, możesz uzyskać jego wynik za pomocą metody pollingu lub wywołania zwrotnego.

Wyniki ankiety

Aby uzyskać stan ArFuture, użyj polecenia ArFuture_getState(). Istnieją 3 stany:

Możesz nadal sprawdzać ArFuture_getState(), aż zadanie 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);
}

Uzyskiwanie wyniku za pomocą wywołania zwrotnego

Wynik wywołania ArFuture możesz też uzyskać za pomocą wywołania zwrotnego. Użyj właściwości ArSession_checkVpsAvailabilityAsync() i podaj wartość callback. Funkcja callback zostanie wywołana w wątku głównym wkrótce po tym, jak stan ArFuture będzie wynosił 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

Aby anulować ArFuture, użyj ArFuture_cancel(). Ze względu na równoległe wykonywanie wątków może się zdarzyć, że próba anulowania nie powiedzie się. Funkcja ArFuture_cancel() zwraca wartość 1, jeśli próba się powiodła, a w przeciwnym razie – wartość 0.

Korzystanie z interfejsu Geospatial API bez pokrycia VPS

Interfejsu Geospatial API można też używać na obszarach, na których nie ma pokrycia VPS. W otoczeniu zewnętrznym z niewielką liczbą przeszkód nad głową lub bez nich GPS może wystarczyć do wygenerowania pozy z wysoką dokładnością.

Co dalej?