Cómo habilitar la RA en tu app de NDK de Android

Habilita la RA para usar funciones de realidad aumentada en tu app nueva o existente.

Configura tu app para que requiera el uso de RA o una RA opcional

Para ahorrar espacio en dispositivos individuales, todas las funciones de RA se almacenan en una app llamada Servicios de Google Play para RA, que Play Store actualiza por separado. Las apps para Android que usan funciones de RA se comunican con los Servicios de Google Play para RA a través del SDK de ARCore. Una app que admite funciones de RA se puede configurar de dos maneras: RA obligatoria y RA opcional. Esta designación determina cómo interactúa la app con la app de Servicios de Google Play para RA.

Una app con RA requerida no puede funcionar sin ARCore. Requiere un dispositivo compatible con ARCore en el que se hayan instalado los Servicios de Google Play para RA.

  • Google Play Store solo permitirá que las apps con RA requerida estén disponibles en los dispositivos compatibles con ARCore.
  • Cuando los usuarios instalan una app obligatoria de RA, Google Play Store instala automáticamente los Servicios de Google Play para RA en sus dispositivos. Sin embargo, tu app aún debe realizar verificaciones adicionales del entorno de ejecución en caso de que los Servicios de Google Play para RA estén desactualizados o se hayan desinstalado de forma manual.

Una app opcional de RA usa ARCore para mejorar la funcionalidad existente. Tiene funciones opcionales de RA que solo se activan en dispositivos compatibles con ARCore que tienen instalados los Servicios de Google Play para RA.

  • Las apps opcionales de RA se pueden instalar y ejecutar en dispositivos que no sean compatibles con ARCore.
  • Cuando los usuarios instalan una app opcional de RA, Google Play Store no instalará automáticamente los Servicios de Google Play para RA en el dispositivo.
Se requiere RARA (opcional)
Uso de la función de RA Tu app necesita ARCore para la funcionalidad básica. ARCore aumenta la funcionalidad de tu app. Tu app puede ejecutarse sin compatibilidad con ARCore.
Visibilidad en Play Store Tu app solo aparece en Play Store para los dispositivos compatibles con ARCore. Tu app sigue los procedimientos normales de publicación.
Método de instalación de los Servicios de Google Play para RA Play Store instala los Servicios de Google Play para RA junto con tu app. Tu app usa ArCoreApk.requestInstall() para descargar e instalar ARCore.
Requisitos de minSdkVersion de Android Android 7.0 (nivel de API 24) Android 4.4 (nivel de API 19), aunque para ejecutar cualquier funcionalidad de RA se requiere al menos Android 7.0 (nivel de API 24)
Se debe usar ArCoreApk_checkAvailability() o ArCoreApk_checkAvailabilityAsync() para verificar la compatibilidad con ARCore y el estado de la instalación.
Debe usar ArCoreApk.requestInstall() para instalar los Servicios de Google Play para RA

Para que la RA de tu app sea obligatoria o opcional, actualiza tu AndroidManifest.xml para incluir las siguientes entradas:

RA obligatoria

<uses-permission android:name="android.permission.CAMERA" />

<!-- Limits app visibility in the Google Play Store to ARCore supported devices
     (https://developers.google.com/ar/devices). -->
<uses-feature android:name="android.hardware.camera.ar" />

<application >
    

    <!-- "AR Required" app, requires "Google Play Services for AR" (ARCore)
         to be installed, as the app does not include any non-AR features. -->
    <meta-data android:name="com.google.ar.core" android:value="required" />
</application>

RA opcional

<uses-permission android:name="android.permission.CAMERA" />

<!-- If your app was previously AR Required, don't forget to remove the
     `<uses-feature android:name="android.hardware.camera.ar" />` entry, as
     this would limit app visibility in the Google Play Store to only
     ARCore supported devices. -->

<application >
    

    <!-- "AR Optional" app, contains non-AR features that can be used when
         "Google Play Services for AR" (ARCore) is not available. -->
    <meta-data android:name="com.google.ar.core" android:value="optional" />
</application>

Luego, modifica el build.gradle de tu app para especificar un minSdkVersion de al menos 24:

 android {
     defaultConfig {
         …
         minSdkVersion 24
     }
 }

Cómo agregar dependencias de compilación

  1. Asegúrate de que el archivo build.gradle de tu proyecto incluya el repositorio Maven de Google.

    allprojects {
        repositories {
            google()
            …
        }
    }
    
  2. Agrega una tarea personalizada al archivo build.gradle de tu módulo para extraer las bibliotecas nativas incluidas del archivo AAR de ARCore. De esta manera, se puede hacer referencia a ellos directamente en un proyecto C o C++.

  3. En el directorio app/build, define una variable para el directorio en el que se extraerán las bibliotecas nativas.

  4. Crea una configuración de Gradle para contener los datos y las tareas de extracción.

    /*
    The ARCore AAR library contains native shared libraries that are
    extracted before building to a temporary directory.
    */
    def arcore_libpath = "${buildDir}/arcore-native"
    
    // Create a configuration to mark which aars to extract .so files from
    configurations { natives }
    
  5. Crea una tarea para copiar las bibliotecas nativas del archivo AAR y agrégala a las dependencias de compilación.

    // Extracts the shared libraries from AARs in the native configuration
    // so that NDK builds can access these libraries.
    task extractNativeLibraries() {
       // Extract every time.
       outputs.upToDateWhen { false }
    
       doFirst {
            configurations.natives.files.each { f ->
                copy {
                    from zipTree(f)
                    into arcore_libpath
                    include "jni/**/*"
                }
            }
        }
    }
    
    tasks.whenTaskAdded {
        task-> if (task.name.contains("external") && !task.name.contains("Clean")) {
            task.dependsOn(extractNativeLibraries)
        }
    }
    
  6. Configurar las marcas de compilación nativas para pasar las ubicaciones a las herramientas de compilación externas.

    // From the sample app.
    externalNativeBuild {
        cmake {
            cppFlags "-std=c++11", "-Wall"
            arguments "-DANDROID_STL=c++_static",
                    "-DARCORE_LIBPATH=${arcore_libpath}/jni",
                    "-DARCORE_INCLUDE=${project.rootDir}/../../libraries/include"
        }
    }
    
  7. Agrega las dependencias para las bibliotecas nativas y de Java.

    dependencies {
         ...
         // Add Java and native dependencies to the ARCore library.
         implementation 'com.google.ar:core:1.33.0'
         natives 'com.google.ar:core:1.33.0'
         ...
    }
    
  8. Haz referencia a las bibliotecas nativas en CMakeLists.txt.

    # Import the ARCore library.
    add_library(arcore SHARED IMPORTED)
    set_target_properties(arcore PROPERTIES IMPORTED_LOCATION
                  ${ARCORE_LIBPATH}/${ANDROID_ABI}/libarcore_sdk_c.so
                  INTERFACE_INCLUDE_DIRECTORIES ${ARCORE_INCLUDE}
    )
    

Realiza verificaciones del tiempo de ejecución

Durante el tiempo de ejecución, haz lo siguiente para asegurarte de que las funciones de RA de tu app se ejecuten sin problemas.

Comprueba si se admite ARCore

Tanto las apps con RA obligatoria como las opcionales deben usar ArCoreApk_checkAvailability() o ArCoreApk_checkAvailabilityAsync() para determinar si el dispositivo actual admite ARCore. En los dispositivos que no son compatibles con ARCore, las apps deben inhabilitar la funcionalidad relacionada con la RA y ocultar los elementos de la IU asociados.

Una app de NDK de Android puede usar la clase ArCoreApk de Java para verificar la compatibilidad y administrar la instalación en la API nativa de sesión de C ARCore. Según la estructura de tu app, esto puede ser más fácil que usar las funciones ArCoreApk_ debido a la gran cantidad de manejo de errores y de interacción con la interfaz de usuario que involucran.

void maybeEnableArButton(JNIEnv env, jobject context) {
  // Likely called from Activity.onCreate() of an activity with AR buttons.
  ArAvailability availability
  ArCoreApk_checkAvailability(env, context, &availability);
  if (availability == AR_AVAILABILITY_UNKNOWN_CHECKING) {
    // Set a timer to call maybeEnableArButton() again after about 200ms.
  }
  if (availability == AR_AVAILABILITY_SUPPORTED_NOT_INSTALLED ||
      availability == AR_AVAILABILITY_SUPPORTED_APK_TOO_OLD ||
      availability == AR_AVAILABILITY_SUPPORTED_INSTALLED) {
    // Show or enable the AR button.
  } else {
    // Hide or disable the AR button.
  }
}
Aunque los Servicios de Google Play para RA están instalados junto con tu app que requiere RA, los usuarios con dispositivos no compatibles pueden instalarlos desde una fuente externa. El uso de ArCoreApk_checkAvailability() o ArCoreApk_checkAvailabilityAsync() para verificar la compatibilidad con ARCore garantiza una experiencia coherente.

Es posible que ArCoreApk_checkAvailability() deba consultar los recursos de red para determinar si el dispositivo es compatible con ARCore. Durante este tiempo, se mostrará AR_AVAILABILITY_UNKNOWN_CHECKING. Para reducir la latencia percibida y el pop-in, las apps deben llamar a ArCoreApk_checkAvailability() una vez al principio de su ciclo de vida para iniciar la consulta, sin ignorar el valor que se muestra. De esta manera, un resultado almacenado en caché estará disponible de inmediato cuando se muestre un elemento de la IU que ingrese a la RA.

Comprueba si están instalados los Servicios de Google Play para RA

Tanto las apps que requieren RA como las que son opcionales deben usar ArCoreApk.requestInstall() antes de crear una sesión de ARCore para verificar si (todavía) está instalada una versión compatible de los Servicios de Google Play para RA y asegurarse de que se hayan descargado todos los datos de perfil de dispositivo de ARCore necesarios.

// Tracks if an installation request has already been triggered.
bool install_requested_;

void nativeOnCreate() {
  // Do other setup here.

  install_requested_ = false;
}

void nativeOnResume(JNIEnv env, jobject activity) {
  if (ar_session_ == null) {
    bool user_requested_install = !install_requested_;

    ArInstallStatus install_status;
    // Ensure that Google Play Services for AR and ARCore device profile data are
    // installed and up to date.
    ArStatus error = ArCoreApk_requestInstall(
        env, activity, user_requested_install, &install_status);
    if (error != AR_SUCCESS) {
      // Inform user of error.
      return;
    }

    switch (install_status) {
      case AR_INSTALL_STATUS_INSTALLED:
        break;
      case AR_INSTALL_STATUS_INSTALL_REQUESTED:
        // When this method returns AR_INSTALL_STATUS_INSTALL_REQUESTED:
        // 1. This activity will be paused.
        // 2. The user is prompted to install or update Google Play
        //    Services for AR (market://details?id=com.google.ar.core).
        // 3. ARCore downloads the latest device profile data.
        // 4. This activity is resumed. The next invocation of
        //    ArCoreApk_requestInstall() will either return
        //    AR_INSTALL_STATUS_INSTALLED or throw an exception if the
        //    installation or update did not succeed.
        install_requested_ = true;
        return;
    }

    // Request camera permissions.

    error = ArSession_create(env, context, &ar_session_);
    if (error != AR_SUCCESS) {
      // Inform user of error.
      return;
    }

    // Configure the ARCore session.
  }

  // Normal onResume behavior.
}

Cumple con los requisitos de privacidad del usuario

Para publicar tu app en Play Store, asegúrate de que cumpla con los Requisitos de privacidad del usuario de ARCore.

¿Qué sigue?