ARCore 中文文档 下载 App

设备不支持 ARCore 或特定 API 排查

问题描述

用户打开你的 AR 应用时遇到以下情况之一:

排查流程图

用户反馈 AR 不工作
    ↓
第一步:确认设备型号和 Android/iOS 版本
    ↓
第二步:检查设备在 ARCore 官方支持列表中吗?
    ↓ 是                                  ↓ 否
第三步:检查 Google Play Services for AR       这是正常情况,应用应该优雅降级
        是否已安装且版本足够新
    ↓
第四步:检查应用声明的 uses-feature
        和 checkAvailability() 返回值
    ↓
第五步:如果是特定 API 不支持
        用 session.isXxxSupported() 检测
    ↓
第六步:根据检测结果降级或提示用户

基础 ARCore 不支持

步骤一:检查支持列表

ARCore 官方维护了一个支持设备列表(Google Developers → ARCore → Supported Devices)。不在列表中的设备官方不保证能用,但实际上很多未列出的设备也能跑——Google 只是没测试过。

检查清单:

条件要求
Android 版本7.0+(API 24)
iOS 版本12.0+
Google Play Services最新版(至少 Play Services for AR 已安装)
摄像头至少一个后置摄像头
OpenGL ES3.0+
IMU加速度计 + 陀螺仪

步骤二:Play Services for AR 问题

很多"设备不支持"其实是 Play Services for AR 没装或版本太旧:

val availability = ArCoreApk.getInstance().checkAvailability(context)

when (availability) {
    SUPPORTED_INSTALLED -> { /* 完全就绪 */ }
    SUPPORTED_APK_TOO_OLD -> {
        // Play Services for AR 版本太旧
        ArCoreApk.getInstance().requestInstall(context, true)
        // 触发 Google 商店更新
    }
    SUPPORTED_NOT_INSTALLED -> {
        // 没装,requestInstall 会弹出安装对话框
        ArCoreApk.getInstance().requestInstall(context, true)
    }
    DEVICE_NOT_SUPPORTED -> {
        // 真不支持,给用户友好提示
    }
}

步骤三:Manifest 声明冲突

<!-- 如果声明为 required,不支持的设备 Play 商店看不到 -->
<!-- 但如果声明了但设备应该支持却被过滤了... -->
<uses-feature android:name="com.google.ar.core" android:required="true" />

检查是否有其他 uses-feature 声明过度限制了设备范围(比如声明了 android.hardware.camera.flash 但你的 ARCore 实际不需要闪光灯)。

Depth API 不工作

问题:session.isDepthSupported() 返回 false

原因解决
设备没有 ToF 深度传感器或双摄检查是否支持被动深度(大多数 ARCore 设备都支持)
Android 版本太低Depth API 需要 Android 8.1+(API 27)
ARCore 版本太旧确认 Play Services for AR 已更新到最新版
设备虽然在支持列表但 Depth 被禁用某些设备在特定 Android 版本上 Depth 被禁,升级系统

问题:Depth API 启用了但深度图是空的

// 检查深度图有效性
val depthImage = frame.acquireDepthImage()
val plane0 = depthImage.planes[0]

// 有些像素深度值为 0 或特定常量 = 无效
val isValid = depthValue > 0 && depthValue < 100f  // 合理范围

// 无效像素多的原因:
// 1. 摄像头没对准任何物体(纯天空)
// 2. 距离太近或太远
// 3. 光滑表面无法计算被动深度
depthImage.close()

被动深度 vs 硬件深度降级

// 自动模式会优先用硬件深度,没有就用被动深度
session.configure(
    Session.Config(context).apply {
        setDepthMode(Session.Config.DepthMode.AUTOMATIC)
    }
)
// 不需要手动区分模式

Geospatial API 不支持

问题:isGeospatialModeSupported() 返回 false

原因解决
设备不在 Geospatial 支持列表查支持列表,极少数老设备不支持
ARCore 版本太旧Geospatial API 需要 v1.23+
iOS 版本iOS 14+ 才支持 Geospatial
设备地理位置(中国国内)Geospatial API 在中国国内不可用(Google 服务受限)。这是最常见原因

Geospatial API 在中国大陆不可用

这是最常见的 Geospatial 问题——Geospatial API 依赖 Google Street View 数据,中国大陆的街景数据由国内地图商提供,Google 无法访问。

解决方案:

Cloud Anchors 不工作

问题:托管/解析一直处于 PENDING 或超时

原因解决
没有网络连接Cloud Anchors 必须有稳定的网络(最好 WiFi)
API Key 没配置AndroidManifest / Info.plist 必须有 API Key
API Key 绑定了错误的包名在 Google Cloud Console 中检查 Key 配置
API 没启用Google Cloud Console → ARCore Cloud Anchor API → 确保 ENABLED
配额用完查 Cloud Console 的使用量
设备时间不准Cloud Anchors 依赖时间戳验证,设备时间漂移会失败

API Key 验证清单

Android:
1. Google Cloud Console → 创建 API Key
2. Key 限制为 Android 应用 → 输入你的应用包名
3. 限制 ARCore Cloud Anchor API 可访问
4. 把 Key 写入 AndroidManifest 的 meta-data
5. 确保使用的是这个 GCP 项目

iOS:
1. 同上步骤 1-3(Key 类型选 iOS)
2. 把 Key 写入 Info.plist 的 GARAPIKey 字段
3. iOS 应用的 Bundle ID 必须在 Key 白名单里
4. Cloud Anchors 在 iOS 上需要额外配置吗?(不需要)

Augmented Images 检测不到

原因解决
目标图像特征点太少换有丰富纹理的图像
数据库没正确加载检查数据库是否被正确设置到 Session.Config
图像物理尺寸没指定addImage() 时传 widthInMeters 参数帮助精确检测
光照太差提示用户改善光照条件
目标图像被大幅裁剪或模糊用原始清晰图重做数据库

调试技巧

用 ARCore Debug Overlay 诊断

session.configure(
    Session.Config(context).apply {
        setShowDiagnostics(true)
    }
)

屏幕上会显示:

版本确认

// 确认运行时 ARCore 版本
val arcoreVersion = ArCoreApk.getInstance().getVersionName(context)
Log.d("ARCore", "Running ARCore $arcoreVersion")

// 确认 Play Services for AR 版本
// 如果版本号很旧,让用户更新