ARCore 设备兼容性检测方法
检测流程总览
ARCore 的设备兼容性不是单一的"支持/不支持"——它取决于三个维度:
- 基础 ARCore 支持:设备能否跑运动跟踪和平面检测
- 特定 API 支持:Depth、Geospatial、Augmented Faces 等高级 API 是否有硬件
- 应用自身要求:你的应用是否声明了某些必需能力
运行时检测就是要在用户进入 AR 功能之前,把这三层条件都过一遍。
步骤一:基础支持检测
val availability = ArCoreApk.getInstance().checkAvailability(context)
when (availability) {
ArCoreApk.Availability.SUPPORTED_INSTALLED -> {
// 完全就绪,直接进入 AR
}
ArCoreApk.Availability.SUPPORTED_APK_TOO_OLD -> {
// 支持但 Google Play Services for AR 版本太旧,提示用户更新
}
ArCoreApk.Availability.SUPPORTED_NOT_INSTALLED -> {
// 设备支持但没装 Play Services for AR,requestInstall() 触发安装
}
ArCoreApk.Availability.DEVICE_NOT_SUPPORTED -> {
// 设备硬件/系统不支持,给用户友好提示
}
ArCoreApk.Availability.UNKNOWN_CHECKING -> {
// 还在检测中,建议延迟 100ms 再查一次
}
ArCoreApk.Availability.UNKNOWN_ERROR -> {
// 检测出错,可能是网络问题
}
}
注意 checkAvailability() 可能返回 UNKNOWN_CHECKING——Google 会在后台从 Play 商店拉设备兼容性列表,首次调用需要几毫秒到几百毫秒。建议做一个延迟重试机制。
步骤二:Google Play Services for AR 安装
// 在 Activity 中调用,会弹出 Google 安装对话框
val installStatus = ArCoreApk.getInstance().requestInstall(activity, userRequestedInstall = true)
when (installStatus) {
ArCoreApk.InstallStatus.INSTALLED -> {
// 用户同意安装并成功
}
ArCoreApk.InstallStatus.INSTALL_REQUESTED -> {
// 安装流程已发起,等待 onActivityResult 回调(或 registerForActivityResult)
}
}
requestInstall 是异步的,需要在生命周期回调中确认安装完成后再创建 Session。
步骤三:特定 API 能力检测
Depth API
// Depth API 需要同时检查设备是否支持和是否声明在 Session 配置中
val session = Session(context)
val isDepthSupported = session.isDepthSupported()
session.configure(
Session.Config(context).apply {
if (isDepthSupported) {
setDepthMode(Session.Config.DepthMode.AUTOMATIC)
} else {
// 降级:用无 Depth 的平面检测
}
}
)
Geospatial API (VPS)
val geospatialSupported = session.isGeospatialModeSupported(
Session.Config.GeospatialMode.ENABLED
)
if (geospatialSupported) {
session.configure(
Session.Config(context).apply {
setGeospatialMode(Session.Config.GeospatialMode.ENABLED)
}
)
}
Augmented Faces
Augmented Faces 不需要预先检测——Session 创建后直接初始化 AugmentedFaceManager 即可,不支持的设备会返回空结果。
在 Manifest 中做预过滤
如果你希望不支持 ARCore 的设备根本看不到你的应用(或至少看不到 AR 功能入口),可以在 AndroidManifest.xml 中声明:
<!-- 声明需要 ARCore,不支持的设备在 Play 商店自动过滤 -->
<uses-feature android:name="com.google.ar.core" android:required="true" />
但这会把部分可能跑基础 ARCore 的中低端设备也过滤掉。更灵活的做法是:
<!-- 声明为 optional,应用自行检测并降级 -->
<uses-feature android:name="com.google.ar.core" android:required="false" />
在运行时根据检测结果决定是否展示 AR 功能入口。
Google Play Services for AR 更新注意
不要硬编码版本号。Google 会持续更新 Play Services for AR,旧版本可能导致新 API 不可用。建议:
- 使用
ArCoreApk.getInstance().requestInstall()让 Google 自己处理版本要求 - 在应用启动时检查
checkAvailability()的返回值,太旧就自动触发更新 - 不要假设用户已经安装了某个特定版本——每次启动都要检查
Unity 中的检测
在 Unity AR Foundation 中,检测逻辑更简单:
using UnityEngine.XR.ARFoundation;
void Start()
{
// AR Session Origin 会自动处理大部分初始化
// 你只需要在用户点击 AR 入口前确认设备就绪
var subsystemManager = SubsystemManager.GetSubsystems<XRSessionSubsystem>();
foreach (var sub in subsystemManager)
{
if (sub is ARCoreSessionSubsystem arcoreSub)
{
// 可以在这里检查特定 API 支持
}
}
}
AR Foundation 会自动处理 Play Services for AR 的安装提示。