2.47 ARCore开发指南

1 minute read

启用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框架支持检查
    1. 通过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.
        ...
      }
    }
    
    • 流程图

    ARCore支持流程图

    1. 摄像头权限
    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();
      }
    }
    
    1. 检查是否已安装兼容版本的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流程图

增强图像

  • 识别和增强图像
    • 借助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会话配置
    
    

参考