Verifica la disponibilidad de los VPS en la ubicación actual del dispositivo

La API de Geospatial usa una combinación de datos de VPS y GPS para generar poses geoespaciales de alta precisión. Se puede usar la API en cualquier lugar donde el dispositivo pueda determinar su ubicación:

  • En áreas con baja precisión de GPS, como espacios interiores y entornos urbanos densos, la API utilizará la cobertura del VPS para generar poses de alta precisión.
  • En entornos al aire libre con pocas obstrucciones aéreas o ninguna, la API de Geospatial puede usar los datos de ubicación del GPS disponibles para generar poses geoespaciales con alta precisión.

Puedes determinar la disponibilidad de la VPS en una posición horizontal determinada antes de que comience la sesión de RA y usarla para crear experiencias más específicas; por ejemplo, para presentar un botón "Entrar a RA" solo cuando la VPS esté disponible.

Habilita la API de ARCore

Tu app debe habilitar la API de ARCore para verificar la disponibilidad de VPS.

Una vez que se habilita la API de ARCore, puedes verificar la disponibilidad de VPS sin lo siguiente:

Verifica la disponibilidad de VPS en tu app

La API de Geospatial se puede usar en cualquier lugar en el que el dispositivo pueda determinar su ubicación. Si tu experiencia de RA depende de la cobertura de VPS, puedes usar ArSession_checkVpsAvailabilityAsync() para obtener un ArVpsAvailabilityFuture, una tarea asíncrona que verifica la disponibilidad del VPS en una posición horizontal determinada. Una vez que tengas el elemento ArVpsAvailabilityFuture, podrás obtener su resultado con un sondeo o una devolución de llamada.

Cómo sondear el resultado

Usa ArFuture_getState() para obtener el estado de ArFuture. Hay tres estados diferentes:

Puedes seguir verificando ArFuture_getState() hasta que se complete la tarea.

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

Obtén el resultado a través de una devolución de llamada

También puedes obtener el resultado de un ArFuture a través de una devolución de llamada. Usa ArSession_checkVpsAvailabilityAsync() y proporciona un callback. Se llamará a esta callback en el subproceso principal poco después de que ArFuture tenga el estado 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);
}

Cancelar ArFuture

Usa ArFuture_cancel() para intentar cancelar la ArFuture. Debido al paralelismo de subprocesos, es posible que tu intento de cancelación no se realice correctamente. ArFuture_cancel() muestra 1 si este intento se realizó correctamente y, en caso contrario, muestra 0.

Usa la API de Geospatial sin cobertura de VPS

La API de Geospatial también se puede usar en áreas que no tienen cobertura VPS. En ambientes al aire libre con pocas obstrucciones por encima o ninguna, el GPS puede ser suficiente para generar una postura con alta precisión.

¿Qué sigue?