Android NDK アプリで AR を有効にする

AR を有効にすると、新規または既存のアプリで拡張現実機能を使用できます。

AR 必須または AR オプションとしてアプリを構成する

個々のデバイスの容量を節約するため、すべての AR 機能は Google Play 開発者サービス(AR)というアプリに保存され、Google Play ストアによって個別に更新されます。AR 機能を使用する Android アプリは、ARCore SDK を使用して Google Play 開発者サービス(AR)と通信します。AR 機能をサポートするアプリは、AR 必須AR オプションの 2 つの方法で設定できます。この指定により、アプリが Google Play 開発者サービス(AR)アプリとやり取りする方法が決まります。

AR 必須アプリは ARCore がないと動作しません。Google Play 開発者サービス(AR)がインストールされた ARCore 対応デバイスが必要です。

  • Google Play ストアでは、ARCore をサポートするデバイスでのみ AR 必須アプリを利用できるようにします。
  • ユーザーが AR 必須アプリをインストールすると、Google Play ストアによって Google Play 開発者サービス(AR)がデバイスに自動的にインストールされます。ただし、Google Play 開発者サービス(AR)が古い場合や手動でアンインストールされた場合に備えて、アプリで追加のランタイム チェックを行う必要があります。

AR Optional アプリは、ARCore を使用して既存の機能を強化します。ARCore 対応デバイスで Google Play 開発者サービス(AR)がインストールされている場合にのみ有効になる、オプションの AR 機能があります。

  • ARCore をサポートしていないデバイスでも、AR オプション アプリをインストールして実行できます。
  • ユーザーが AR オプション アプリをインストールしても、Google Play ストアはデバイスに Google Play 開発者サービス(AR)を自動的にインストールしません。
AR が必要かAR 省略可
AR 機能の使用状況 アプリの基本機能に ARCore が必要である。 ARCore はアプリの機能を拡張します。アプリは ARCore のサポートなしで実行できます。
Google Play ストアの公開設定 アプリは、ARCore をサポートするデバイスの Google Play ストアにのみ表示されます。 アプリは通常のリスティング手順に沿って登録されます。
Google Play 開発者サービス(AR)のインストール方法 Google Play ストアは、アプリとともに Google Play 開発者サービス(AR)をインストールします。 アプリは ArCoreApk.requestInstall() を使用して ARCore をダウンロードし、インストールします。
Android minSdkVersion の要件 Android 7.0(API レベル 24) Android 4.4(API レベル 19)。ただし、AR 機能を実行するには、Android 7.0(API レベル 24)以上が必要です。
ArCoreApk_checkAvailability() または ArCoreApk_checkAvailabilityAsync() を使用して、ARCore のサポートとインストール ステータスを確認する必要があります。
ArCoreApk.requestInstall() を使用して Google Play 開発者サービス(AR)をインストールする必要があります

アプリを AR 必須または AR オプションにするには、AndroidManifest.xml を更新して次のエントリを含めます。

AR が必要か

<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 を変更して、少なくとも 24minSdkVersion を指定します。

 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 必須アプリと AR オプション アプリの両方で、ArCoreApk_checkAvailability() または ArCoreApk_checkAvailabilityAsync() を使用して、現在のデバイスが ARCore をサポートしているかどうかを判断する必要があります。ARCore をサポートしていないデバイスでは、アプリは AR 関連の機能を無効にし、関連する UI 要素を非表示にすべきです。

Android NDK アプリは、Java ArCoreApk クラスを使用して、ネイティブ C ARCore Session API の互換性を確認し、インストールを管理できます。アプリの構造によっては、エラー処理やユーザー インターフェースの操作が大量に発生するため、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.
  }
}
AR 必須アプリと一緒に Google Play 開発者サービス(AR)がインストールされていても、サポートされていないデバイスのユーザーは外部ソースからインストールする可能性があります。ArCoreApk_checkAvailability() または ArCoreApk_checkAvailabilityAsync() を使用して ARCore のサポートを確認すると、一貫したエクスペリエンスが保証されます。

ArCoreApk_checkAvailability() は、デバイスが ARCore をサポートしているかどうかを判断するために、ネットワーク リソースのクエリが必要になる場合があります。この間は AR_AVAILABILITY_UNKNOWN_CHECKING を返します。認識されるレイテンシとポップインを減らすため、アプリはライフサイクルの早い段階で ArCoreApk_checkAvailability() を 1 回呼び出してクエリを開始し、戻り値を無視する必要があります。これにより、AR への移行 UI 要素が表示される可能性があるときに、キャッシュに保存された結果をすぐに利用できるようになります。

Google Play 開発者サービス(AR)がインストールされているかどうかを確認する

AR 必須アプリと AR オプション アプリの両方で、ARCore セッションを作成する前に ArCoreApk.requestInstall() を使用して、互換性のあるバージョンの 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.
}

ユーザーのプライバシーに関する要件を遵守する

アプリを Google Play ストアで公開するには、アプリが ARCore のユーザーのプライバシーに関する要件に準拠していることを確認してください。

次のステップ