2.47 ARCore开发指南
启用ARCore
- 向
manifest
添加AR必备或AR可选条目-
AR可选应用(包含可选AR功能)
<!-- AR Optional apps must declare minSdkVersion ≥ 14 --> <uses-sdk android:minSdkVersion="14" /> <uses-permission android:name="android.permission.CAMERA" /> ... <application> <meta-data android:name="com.google.ar.core" android:value="optional" /> ... </application>
-
AR必备应用(不支持AR则无法使用)
<!-- AR Required apps must declare minSdkVersion ≥ 24 --> <uses-sdk android:minSdkVersion="24" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> ... <application> <meta-data android:name="com.google.ar.core" android:value="required" /> ... </application>
-
-
添加构建依赖
dependencies { ... implementation 'com.google.ar:core:1.5.0' }
- 运行时权限和ARCore框架支持检查
- 通过
ArCoreApk#checkAvailability()
检查是否支持ARCore
protected void onCreate(Bundle savedInstanceState) { ... // Enable AR related functionality on ARCore supported devices only. checkARCoreAvailability(); ... } void checkARCoreAvailability() { // 1. ArCoreApk#checkAvailability() ArCoreApk.Availability availability = ArCoreApk.getInstance().checkAvailability(this); // 2. Availability#isTransient() if (availability.isTransient()) { // Re-query at 5Hz while compatibility is checked in the background. // using handler#postDelayed(Runnable, 200); checkARCoreAvailability(); } // 3. Availability#isSupported() if (availability.isSupported()) { ... // indicator on the button. } else { // Unsupported or unknown. ... } }
- 流程图
- 摄像头权限
protected void onResume() { ... // ARCore requires camera permission to operate. if (!CameraPermissionHelper.hasCameraPermission(this)) { CameraPermissionHelper.requestCameraPermission(this); return; } ... } public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] results) { if (!CameraPermissionHelper.hasCameraPermission(this)) { ... if (!CameraPermissionHelper.shouldShowRequestPermissionRationale(this)) { // Permission denied with checking "Do not ask again". CameraPermissionHelper.launchPermissionSettings(this); } finish(); } }
- 检查是否已安装兼容版本的ARCore
// Set to true ensures requestInstall() triggers installation if necessary. private boolean mUserRequestedInstall = true; @Override protected void onResume() { ... // Make sure ARCore is installed and up to date. ... if (mSession == null) { switch (ArCoreApk.getInstance().requestInstall(this, mUserRequestedInstall)) { case INSTALLED: // Success, create the AR session. mSession = new Session(this); break; case INSTALL_REQUESTED: // Ensures next invocation of requestInstall() will either return // INSTALLED or throw an exception. mUserRequestedInstall = false; return; } } ... }
- 流程图
- 通过
增强图像
- 识别和增强图像
- 借助ARCore中的增强图像功能, 支持构建在用户环境中响应2D图像的AR应用。需提供一组参考图像, 在摄像头视野中检测到图像时, ARCore跟踪会返回这些图像在AR会话中的物理为止
- 增强图像适用性
- 每个图像数据库可以存储最多1000个参考图像的特征点信息
- ARCore可以在环境中同步跟踪最多20个图像, 但无法跟踪同一图像的多个实例
- 环境中的物理图像必须至少为15cm * 15cm且必须平坦(不能起皱或卷绕在瓶子上)
- 在物理图像被跟踪后, ARCore会提供对位置, 方向和物理大小的估算。随着ARCore收集的数据增多, 这些估算会持续优化
- ARCore无法跟踪移动的图像, 不过它可以在图像停止移动后继续跟踪
- 所有跟踪都在设备上完成, 所以无需网络连接。可以在设备端或通过网络更新参考图像, 无需应用更新
- 创建图像数据库
- 加载保存过的图像数据库, 然后添加更多的基准图像
InputStream inputStream = context.getAssets().open("example.imgdb"); // 加载现有图像数据库 AugmentedImageDatabase imageDatabase = AugmentedImageDatabase.deserialize(inputStream);
- 新建空数据库, 然后逐一添加基准图像
// 1. 新建空数据库 AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(); // 2. 添加图像 Bitmap bitmap = ...; ... // 返回的索引稍后用于识别检测到了哪个基准图像 int index = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);
-
启动图像跟踪
// 通过将会话config设置为配置有所需的图像数据库, 将ARCore会话配置