启用 AR 即可在新应用或现有应用中使用增强现实功能。
将应用配置为“AR 必需”或“AR 可选”
为了节省各个设备上的空间,所有 AR 功能都存储在一个名为 Google Play Services for AR 的应用中,该应用由 Play 商店单独更新。使用 AR 功能的 Android 应用使用 ARCore SDK 与 Google Play 服务 AR 版进行通信。支持 AR 功能的应用可以通过以下两种方式进行配置:AR 必需和 AR 可选。此指定决定了应用与 Google Play 服务(面向 AR)应用的互动方式。
如果应用标记为必须使用 AR,则必须使用 ARCore 才能正常运行。它需要一部已安装“面向 AR 的 Google Play 服务”的受 ARCore 支持的设备。
- Google Play 商店只会在支持 ARCore 的设备上提供 AR 必需应用。
- 当用户安装需要 AR 的应用时,Google Play 商店会自动在其设备上安装“面向 AR 的 Google Play 服务”。不过,您的应用仍必须执行额外的运行时检查,以防 Google Play 地图 AR 服务已过时或已被手动卸载。
AR 可选应用使用 ARCore 来增强现有功能。它具有可选的 AR 功能,这些功能仅在已安装面向 AR 的 Google Play 服务且支持 ARCore 的设备上启用。
- 不支持 ARCore 的设备可以安装和运行 AR 可选应用。
- 当用户安装 AR 可选应用时,Google Play 商店不会在设备上自动安装面向 AR 的 Google Play 服务。
必须使用 AR | AR 可选 | |
---|---|---|
AR 功能使用情况 | 您的应用需要 ARCore 才能实现基本功能。 | ARCore 可增强应用的功能。您的应用无需 ARCore 支持即可运行。 |
Play 商店公开范围 | 您的应用仅在支持 ARCore 的设备上在 Play 商店中上架。 | 您的应用遵循正常的商品详情提交流程。 |
“面向 AR 的 Google Play 服务”安装方法 | Play 商店会随您的应用一起安装“面向 AR 的 Google Play 服务”。 | 您的应用使用
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()
安装“面向 AR 的 Google Play 服务” |
如需将应用设为 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
,将 minSdkVersion
指定为至少 24
:
android {
defaultConfig {
…
minSdkVersion 24
}
}
添加 build 依赖项
确保项目的
build.gradle
文件包含 Google 的 Maven 代码库。allprojects { repositories { google() … } }
将自定义任务添加到模块的
build.gradle
文件,以从 ARCore AAR 文件中提取包含的原生库。这样,便可在 C 或 C++ 项目中直接引用它们。在
app/build
目录中,定义一个指向要将原生库提取到的目录的变量。创建一个 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 }
创建一个任务来从 AAR 文件复制原生库,并将其添加到 build 依赖项。
// 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) } }
配置原生 build 标志,以将位置传递给外部 build 工具。
// 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" } }
添加 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' ... }
在
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 相关功能并隐藏关联的界面元素。
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.
}
}
ArCoreApk_checkAvailability()
或 ArCoreApk_checkAvailabilityAsync()
检查 ARCore 支持情况可确保提供一致的体验。
ArCoreApk_checkAvailability()
可能需要查询网络资源,以确定设备是否支持 ARCore。在此期间,它会返回 AR_AVAILABILITY_UNKNOWN_CHECKING
。为了减少感知延迟时间和弹出式窗口,应用应在其生命周期的早期调用 ArCoreApk_checkAvailability()
一次,以发起查询,并忽略返回的值。这样,当系统可能显示 AR 进入界面元素时,系统会立即提供缓存的结果。
检查是否已安装“面向 AR 的 Google Play 服务”
无论是 AR 必需应用还是 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 商店中发布应用,请确保您的应用符合 ARCore 的用户隐私权要求。
后续步骤
- 了解如何配置 ARCore 会话。