AR in der Android NDK App aktivieren

Aktivieren Sie AR, um AR-Funktionen in Ihrer neuen oder vorhandenen App zu verwenden.

Ihre App als „AR erforderlich“ oder „AR optional“ konfigurieren

Um auf einzelnen Geräten Platz zu sparen, werden alle AR-Funktionen in einer App namens Google Play-Dienste für AR gespeichert, die separat über den Play Store aktualisiert wird. Android-Apps, die AR-Funktionen verwenden, kommunizieren über das ARCore SDK mit den Google Play-Diensten für AR. Eine App, die AR-Funktionen unterstützt, kann auf zwei Arten konfiguriert werden: AR erforderlich und AR optional. Diese Angabe bestimmt, wie die App mit der App „Google Play-Dienste für AR“ interagiert.

Eine App mit der Kennzeichnung AR erforderlich funktioniert ohne ARCore nicht. Es ist ein ARCore-kompatibles Gerät mit installierten Google Play-Diensten für AR erforderlich.

  • Im Google Play Store sind Apps mit der Kennzeichnung „Für AR erforderlich“ nur auf Geräten verfügbar, die ARCore unterstützen.
  • Wenn Nutzer eine App installieren, für die AR erforderlich ist, werden die Google Play-Dienste für AR automatisch über den Google Play Store auf ihrem Gerät installiert. Ihre App muss jedoch weiterhin zusätzliche Laufzeitprüfungen ausführen, falls die Google Play-Dienste für AR veraltet sind oder manuell deinstalliert wurden.

In einer AR-optionalen App wird ARCore verwendet, um vorhandene Funktionen zu verbessern. Die optionalen AR-Funktionen sind nur auf Geräten verfügbar, die ARCore unterstützen, auf denen die Google Play-Dienste für AR installiert sind.

  • Optionale AR-Apps können auf Geräten installiert und ausgeführt werden, die ARCore nicht unterstützen.
  • Wenn Nutzer eine optionale AR-App installieren, werden die Google Play-Dienste für AR nicht automatisch vom Google Play Store auf dem Gerät installiert.
AR erforderlichAR optional
Nutzung der AR-Funktion Ihre App benötigt ARCore für die grundlegenden Funktionen. ARCore erweitert die Funktionen Ihrer App. Ihre App kann auch ohne ARCore-Unterstützung ausgeführt werden.
Sichtbarkeit im Play Store Ihre App wird nur auf Geräten mit ARCore-Unterstützung im Play Store aufgeführt. Ihre App folgt den üblichen Verfahren für Einträge.
Installationsmethode für Google Play-Dienste für AR Der Play Store installiert zusammen mit Ihrer App die Google Play-Dienste für AR. Deine App verwendet ArCoreApk.requestInstall() um ARCore herunterzuladen und zu installieren.
Anforderungen für Android minSdkVersion Android 7.0 (API-Level 24) Android 4.4 (API-Level 19), zum Ausführen von AR-Funktionen ist jedoch Android 7.0 (API-Level 24) erforderlich.
Sie müssen ArCoreApk_checkAvailability() oder ArCoreApk_checkAvailabilityAsync() verwenden, um den ARCore-Support und den Installationsstatus zu prüfen.
Muss verwendet werden ArCoreApk.requestInstall() um Google Play-Dienste für AR zu installieren

Wenn du festlegen möchtest, dass deine App AR erforderlich oder optional ist, musst du deine AndroidManifest.xml so ändern, dass sie die folgenden Einträge enthält:

AR erforderlich

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

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

Ändern Sie dann die build.gradle Ihrer App, um einen minSdkVersion von mindestens 24 anzugeben:

 android {
     defaultConfig {
         …
         minSdkVersion 24
     }
 }

Build-Abhängigkeiten hinzufügen

  1. Achten Sie darauf, dass die Datei build.gradle Ihres Projekts das Maven-Repository von Google enthält.

    allprojects {
        repositories {
            google()
            …
        }
    }
    
  2. Fügen Sie der build.gradle-Datei Ihres Moduls eine benutzerdefinierte Aufgabe hinzu, um die enthaltenen nativen Bibliotheken aus der ARCore-Datei AAR zu extrahieren. Auf diese Weise kann in einem C- oder C++-Projekt direkt auf sie verwiesen werden.

  3. Definieren Sie im Verzeichnis app/build eine Variable für das Verzeichnis, in das die nativen Bibliotheken extrahiert werden sollen.

  4. Erstellen Sie eine Gradle-Konfiguration für die Daten- und Extraktionsaufgaben.

    /*
    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. Erstellen Sie eine Aufgabe, um die nativen Bibliotheken aus der AAR-Datei zu kopieren und den Build-Abhängigkeiten hinzuzufügen.

    // 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. Konfigurieren Sie die nativen Build-Flags so, dass die Speicherorte an die externen Build-Tools übergeben werden.

    // 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. Fügen Sie die Abhängigkeiten sowohl für die Java- als auch für die nativen Bibliotheken hinzu.

    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. Referenzieren Sie die nativen Bibliotheken in 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}
    )
    

Laufzeitprüfungen ausführen

Führen Sie während der Laufzeit die folgenden Schritte aus, damit AR-Funktionen in Ihrer App reibungslos funktionieren.

Prüfen, ob ARCore unterstützt wird

Sowohl bei Apps, für die AR erforderlich ist, als auch bei Apps, für die AR optional ist, sollte ArCoreApk_checkAvailability() oder ArCoreApk_checkAvailabilityAsync() verwendet werden, um zu ermitteln, ob das aktuelle Gerät ARCore unterstützt. Auf Geräten, die ARCore nicht unterstützen, sollten in Apps AR-bezogene Funktionen deaktiviert und zugehörige UI-Elemente ausgeblendet werden.

Eine Android-NDK-App kann die Java-Klasse ArCoreApk verwenden, um die Kompatibilität zu prüfen und die Installation in der nativen C ARCore-Sitzungs-API zu verwalten. Je nach Struktur Ihrer App ist dies möglicherweise einfacher als die Verwendung der ArCoreApk_-Funktionen, da eine große Menge an Fehlerbehandlung und Interaktion mit der Benutzeroberfläche erforderlich ist.

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-Dienste für AR wird zwar zusammen mit deiner App für AR erforderlich installiert, Nutzer mit nicht unterstützten Geräten installieren sie aber möglicherweise von einer externen Quelle. Mit ArCoreApk_checkAvailability() oder ArCoreApk_checkAvailabilityAsync() kannst du prüfen, ob ARCore-Support für dich verfügbar ist.

ArCoreApk_checkAvailability() muss möglicherweise Netzwerkressourcen abfragen, um festzustellen, ob das Gerät ARCore unterstützt. In dieser Zeit wird AR_AVAILABILITY_UNKNOWN_CHECKING zurückgegeben. Um die wahrgenommene Latenz und das Pop-in zu reduzieren, sollten Apps ArCoreApk_checkAvailability() einmal zu Beginn des Lebenszyklus aufrufen, um die Abfrage zu starten, und den zurückgegebenen Wert ignorieren. Auf diese Weise ist ein im Cache gespeichertes Ergebnis sofort verfügbar, wenn ein UI-Element zum Eintreten in AR angezeigt wird.

Prüfen, ob Google Play-Dienste für AR installiert ist

Sowohl für AR required als auch für AR optionale Apps muss Folgendes verwendet werden: ArCoreApk.requestInstall() bevor Sie eine ARCore-Sitzung erstellen, um zu prüfen, ob eine kompatible Version der Google Play-Dienste für AR (noch) installiert ist und ob alle erforderlichen ARCore-Geräteprofildaten heruntergeladen wurden.

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

Anforderungen an den Datenschutz für Nutzer erfüllen

Damit Sie Ihre App im Play Store veröffentlichen können, muss sie den Anforderungen an den Datenschutz für Nutzer von ARCore entsprechen.

Weiteres Vorgehen