ARCore 中文文档 下载 App

ARCore 设备兼容性检测方法

检测流程总览

ARCore 的设备兼容性不是单一的"支持/不支持"——它取决于三个维度:

  1. 基础 ARCore 支持:设备能否跑运动跟踪和平面检测
  2. 特定 API 支持:Depth、Geospatial、Augmented Faces 等高级 API 是否有硬件
  3. 应用自身要求:你的应用是否声明了某些必需能力

运行时检测就是要在用户进入 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 不可用。建议:

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 的安装提示。