Включите AR в приложении Android NDK.

Включите AR, чтобы использовать функции дополненной реальности в вашем новом или существующем приложении.

Настройте свое приложение так, чтобы оно было обязательным или необязательным.

Чтобы сэкономить место на отдельных устройствах, все функции AR хранятся в приложении Google Play Services for AR , которое обновляется отдельно в Play Store. Приложения Android, использующие функции AR, взаимодействуют со службами Google Play для AR с помощью ARCore SDK. Приложение, поддерживающее функции AR, можно настроить двумя способами: «Обязательно к дополненной реальности» и «Дополнительно к дополненной реальности» . Это обозначение определяет, как приложение взаимодействует с приложением «Сервисы Google Play для AR».

Приложение , требующее AR, не может работать без ARCore. Для этого требуется устройство с поддержкой ARCore , на котором установлены Сервисы Google Play для AR.

  • В магазине Google Play будут доступны только приложения, необходимые для AR, на устройствах, поддерживающих ARCore.
  • Когда пользователи устанавливают приложение, требующее AR, Google Play Store автоматически устанавливает Сервисы Google Play для AR на их устройство. Однако ваше приложение все равно должно выполнять дополнительные проверки во время выполнения на случай, если Сервисы Google Play для AR устарели или были удалены вручную.

Дополнительное приложение AR использует ARCore для расширения существующих функций. Он имеет дополнительные функции AR, которые активируются только на устройствах с поддержкой ARCore, на которых установлены Сервисы Google Play для AR.

  • Дополнительные приложения AR можно устанавливать и запускать на устройствах, которые не поддерживают ARCore.
  • Когда пользователи устанавливают дополнительное приложение AR, Google Play Store не будет автоматически устанавливать Сервисы Google Play для AR на устройство.
Требуется дополненная реальность AR опционально
Использование функций AR Вашему приложению требуется ARCore для базовой функциональности. ARCore расширяет функциональность вашего приложения. Ваше приложение может работать без поддержки ARCore.
Видимость Play Маркета Ваше приложение отображается в Play Store только на устройствах, поддерживающих ARCore. Ваше приложение соответствует обычным процедурам листинга .
Сервисы Google Play для метода установки AR Play Store устанавливает сервисы Google Play для AR вместе с вашим приложением. Ваше приложение использует ArCoreApk_requestInstall() для загрузки и установки ARCore.
Требования Android minSdkVersion Android 7.0 (уровень API 24) Android 7.0 (уровень API 24)
Необходимо использовать ArCoreApk_checkAvailability() или ArCoreApk_checkAvailabilityAsync() , чтобы проверить поддержку ARCore и статус установки.
Необходимо использовать ArCoreApk_requestInstall() для установки Сервисов Google Play для AR.

Чтобы сделать приложение AR обязательным или необязательным, обновите файл AndroidManifest.xml , включив в него следующие записи:

Требуется дополненная реальность

<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>

AR опционально

<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>

Затем измените build.gradle вашего приложения, указав minSdkVersion не менее 24 :

 android {
     defaultConfig {
         …
         minSdkVersion 24
     }
 }

Добавить зависимости сборки

  1. Убедитесь, что файл build.gradle вашего проекта включает репозиторий Google Maven.

    allprojects {
        repositories {
            google()
            …
        }
    }
    
  2. Добавьте пользовательскую задачу в файл build.gradle вашего модуля, чтобы извлечь включенные собственные библиотеки из файла ARCore AAR . Таким образом, на них можно напрямую ссылаться в проекте C или C++.

  3. В каталоге app/build определите переменную для каталога, в который будут извлечены собственные библиотеки.

  4. Создайте конфигурацию Gradle для хранения данных и задач извлечения.

    /*
    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. Создайте задачу для копирования собственных библиотек из файла AAR и добавления их в зависимости сборки.

    // 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. Настройте собственные флаги сборки для передачи местоположений внешним инструментам сборки.

    // 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. Добавьте зависимости как для 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. Ссылка на собственные библиотеки в 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}
    )
    

Выполните проверки во время выполнения

Во время выполнения выполните следующие действия, чтобы обеспечить бесперебойную работу функций AR в вашем приложении.

Проверьте, поддерживается ли ARCore

Как AR Required, так и AR необязательные приложения должны использовать ArCoreApk_checkAvailability() или ArCoreApk_checkAvailabilityAsync() , чтобы определить, поддерживает ли текущее устройство ARCore. На устройствах, которые не поддерживают ARCore, приложения должны отключать функции, связанные с AR, и скрывать связанные элементы пользовательского интерфейса.

Приложение Android NDK может использовать класс Java ArCoreApk для проверки совместимости и управления установкой в ​​собственном API сеанса C ARCore. В зависимости от структуры вашего приложения это может быть проще, чем использование функций ArCoreApk_ , из-за большого объема обработки ошибок и взаимодействия с пользовательским интерфейсом.

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.
  }
}
Несмотря на то, что Сервисы Google Play для AR установлены вместе с вашим приложением, требующим AR, пользователи с неподдерживаемыми устройствами могут установить его из внешнего источника. Использование ArCoreApk_checkAvailability() или ArCoreApk_checkAvailabilityAsync() для проверки поддержки ARCore обеспечивает согласованную работу.

ArCoreApk_checkAvailability() может потребоваться запросить сетевые ресурсы, чтобы определить, поддерживает ли устройство ARCore. В течение этого времени он вернет AR_AVAILABILITY_UNKNOWN_CHECKING . Чтобы уменьшить воспринимаемую задержку и количество всплывающих окон, приложения должны вызывать ArCoreApk_checkAvailability() один раз в начале своего жизненного цикла, чтобы инициировать запрос, игнорируя возвращаемое значение. Таким образом, кэшированный результат будет доступен сразу же, как только может отобразиться элемент пользовательского интерфейса, входящий в AR.

Проверьте, установлены ли Сервисы Google Play для AR.

Как AR Required, так и AR необязательные приложения должны вызывать ArCoreApk_requestInstall() перед созданием сеанса ARCore, чтобы проверить, установлена ​​ли (все еще) совместимая версия Служб Google Play для AR, и убедиться, что все необходимые данные профиля устройства ARCore загружены.

// 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.
}

Соблюдайте требования конфиденциальности пользователей.

Чтобы опубликовать свое приложение в Play Store, убедитесь, что оно соответствует требованиям ARCore к конфиденциальности пользователей .

Что дальше