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

Interfejs Geospatial API korzysta z kombinacji VPS i danych GPS do generowania zdjęć geoprzestrzennych o dużej dokładności. Interfejsu API można używać w każdym miejscu, w którym urządzenie może określić swoją lokalizację:

  • Na obszarach o niskiej dokładności sygnału GPS, takich jak przestrzenie wewnątrz budynków czy gęsty obszar miejski, interfejs API będzie wykorzystywać dane VPS do generowania zdjęć o dużej dokładności.
  • W środowiskach zewnętrznych z niewielką liczbą przeszkód lub niewidocznymi z powietrza interfejs Geospatial API może wykorzystywać dostępne dane o lokalizacji GPS do bardzo dokładnego generowania pozycji geoprzestrzennych.

Możesz określić dostępność VPS w danej pozycji w poziomie przed rozpoczęciem sesji AR i wykorzystać ją do stworzenia bardziej szczegółowych doświadczeń, na przykład do wyświetlania przycisku „Enter AR” tylko wtedy, gdy jest on dostępny.

Włącz interfejs ARCore API

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

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

Sprawdź dostępność VPS w swojej aplikacji

Interfejsu Geospatial API można używać wszędzie tam, gdzie urządzenie może określić swoją lokalizację. Jeśli działanie AR zależy od zasięgu VPS, możesz użyć ArSession_checkVpsAvailabilityAsync(), aby uzyskać ArVpsAvailabilityFuture, czyli asynchroniczne zadanie, które sprawdza dostępność VPS w danej pozycji w poziomie. Gdy już masz ArVpsAvailabilityFuture, możesz uzyskać jego wynik przez odpytywanie lub oddzwanianie.

Przeprowadź ankietę

Użyj ArFuture_getState(), aby uzyskać stan ArFuture. Istnieją 3 stany:

Możesz sprawdzać konto 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 za pomocą wywołania zwrotnego

Wyniki działania ArFuture możesz też uzyskać, wywołując połączenie zwrotne. Użyj ArSession_checkVpsAvailabilityAsync() i podaj callback. Ten obiekt callback zostanie wywołany w wątku głównym wkrótce po tym, gdy ArFuture ma 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 umowę ArFuture

Użyj ArFuture_cancel(), aby spróbować anulować ArFuture. Z powodu równoległości wątków próba anulowania może się nie udać. ArFuture_cancel() zwraca wartość 1, jeśli próba zakończyła się sukcesem. 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 są objęte zasięgiem VPS. W warunkach na zewnątrz, w których występuje niewiele przeszkód z powietrza lub nie ma ich wcale, do wykonania pozycji z dużą dokładnością GPS może wystarczyć sygnał GPS.

Co dalej