Включите AR в своем приложении для Android

Включите 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
     }
 }

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

Чтобы добавить ARCore в проект Android Studio, выполните следующие действия:

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

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

    dependencies {
        …
        implementation 'com.google.ar:core:1.33.0'
    }
    

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

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

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

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

Котлин

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

  // Enable AR-related functionality on ARCore supported devices only.
  maybeEnableArButton()
  …
}

fun maybeEnableArButton() {
  ArCoreApk.getInstance().checkAvailabilityAsync(this) { availability ->
    if (availability.isSupported) {
      mArButton.visibility = View.VISIBLE
      mArButton.isEnabled = true
    } else { // The device is unsupported or unknown.
      mArButton.visibility = View.INVISIBLE
      mArButton.isEnabled = false
    }
  }
}

Джава

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Enable AR-related functionality on ARCore supported devices only.
  maybeEnableArButton();
  …
}

void maybeEnableArButton() {
  ArCoreApk.getInstance().checkAvailabilityAsync(this, availability -> {
    if (availability.isSupported()) {
      mArButton.setVisibility(View.VISIBLE);
      mArButton.setEnabled(true);
    } else { // The device is unsupported or unknown.
      mArButton.setVisibility(View.INVISIBLE);
      mArButton.setEnabled(false);
    }
  });
}
Несмотря на то, что Сервисы Google Play для AR установлены вместе с вашим приложением AR Required, пользователи с неподдерживаемыми устройствами могут установить его из внешнего источника. Использование ArCoreApk.checkAvailability() или ArCoreApk.checkAvailabilityAsync() для проверки поддержки ARCore обеспечивает согласованную работу.

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

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

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

Котлин

// requestInstall(Activity, true) will triggers installation of
// Google Play Services for AR if necessary.
var mUserRequestedInstall = true

override fun onResume() {
  super.onResume()

  // Check camera permission.
  …

  // Ensure that Google Play Services for AR and ARCore device profile data are
  // installed and up to date.
  try {
    if (mSession == null) {
      when (ArCoreApk.getInstance().requestInstall(this, mUserRequestedInstall)) {
        ArCoreApk.InstallStatus.INSTALLED -> {
          // Success: Safe to create the AR session.
          mSession = Session(this)
        }
        ArCoreApk.InstallStatus.INSTALL_REQUESTED -> {
          // When this method returns `INSTALL_REQUESTED`:
          // 1. ARCore pauses this activity.
          // 2. ARCore prompts the user 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. ARCore resumes this activity. The next invocation of
          //    requestInstall() will either return `INSTALLED` or throw an
          //    exception if the installation or update did not succeed.
          mUserRequestedInstall = false
          return
        }
      }
    }
  } catch (e: UnavailableUserDeclinedInstallationException) {
    // Display an appropriate message to the user and return gracefully.
    Toast.makeText(this, "TODO: handle exception " + e, Toast.LENGTH_LONG)
        .show()
    return
  } catch (…) {
    …
    return  // mSession remains null, since session creation has failed.
  }
  …
}

Джава

// requestInstall(Activity, true) will trigger installation of
// Google Play Services for AR if necessary.
private boolean mUserRequestedInstall = true;

@Override
protected void onResume() {
  super.onResume();

  // Check camera permission.
  …

  // Ensure that Google Play Services for AR and ARCore device profile data are
  // installed and up to date.
  try {
    if (mSession == null) {
      switch (ArCoreApk.getInstance().requestInstall(this, mUserRequestedInstall)) {
        case INSTALLED:
          // Success: Safe to create the AR session.
          mSession = new Session(this);
          break;
        case INSTALL_REQUESTED:
          // When this method returns `INSTALL_REQUESTED`:
          // 1. ARCore pauses this activity.
          // 2. ARCore prompts the user 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. ARCore resumes this activity. The next invocation of
          //    requestInstall() will either return `INSTALLED` or throw an
          //    exception if the installation or update did not succeed.
          mUserRequestedInstall = false;
          return;
      }
    }
  } catch (UnavailableUserDeclinedInstallationException e) {
    // Display an appropriate message to the user and return gracefully.
    Toast.makeText(this, "TODO: handle exception " + e, Toast.LENGTH_LONG)
        .show();
    return;
  } catch (…) {
    …
    return;  // mSession remains null, since session creation has failed.
  }
  …
}

Запросить разрешение камеры

Как AR-дополнительные, так и AR-обязательные приложения должны убедиться, что разрешение камеры предоставлено, прежде чем создавать сеанс AR.

Котлин

override fun onResume() {
  super.onResume()

  // ARCore requires camera permission to operate.
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    CameraPermissionHelper.requestCameraPermission(this)
    return
  }

  …
}

Джава

@Override
protected void onResume() {
  super.onResume();

  // ARCore requires camera permission to operate.
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    CameraPermissionHelper.requestCameraPermission(this);
    return;
  }

  …
}

Ваша деятельность AR также должна реализовывать onRequestPermissionsResult() .

Котлин

override fun onRequestPermissionsResult(
  requestCode: Int,
  permissions: Array<String>,
  results: IntArray
) {
  super.onRequestPermissionsResult(requestCode, permissions, results)
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    Toast.makeText(this, "Camera permission is needed to run this application", Toast.LENGTH_LONG)
      .show()
    if (!CameraPermissionHelper.shouldShowRequestPermissionRationale(this)) {
      // Permission denied with checking "Do not ask again".
      CameraPermissionHelper.launchPermissionSettings(this)
    }
    finish()
  }
}

Джава

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] results) {
  super.onRequestPermissionsResult(requestCode, permissions, results);
  if (!CameraPermissionHelper.hasCameraPermission(this)) {
    Toast.makeText(this, "Camera permission is needed to run this application", Toast.LENGTH_LONG)
        .show();
    if (!CameraPermissionHelper.shouldShowRequestPermissionRationale(this)) {
      // Permission denied with checking "Do not ask again".
      CameraPermissionHelper.launchPermissionSettings(this);
    }
    finish();
  }
}

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

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

Что дальше