Neo trên đám mây ARCore với neo đám mây ổn định

1. Tổng quan

ARCore là một nền tảng để tạo các ứng dụng thực tế tăng cường trên thiết bị di động. Cloud Anchors API giúp bạn tạo các ứng dụng thực tế tăng cường (AR) có chung một khung tham chiếu, cho phép nhiều người dùng đặt nội dung ảo ở cùng một vị trí trong thế giới thực.

Lớp học lập trình này hướng dẫn bạn cách sử dụng Cloud Anchors API. Bạn sẽ lấy một ứng dụng ARCore hiện có, sửa đổi ứng dụng đó để sử dụng Cloud Anchors và tạo một trải nghiệm AR được chia sẻ.

Điểm neo ARCore và Điểm neo đám mây cố định

Một khái niệm cơ bản trong ARCore là Anchor (Điểm neo), mô tả một vị trí cố định trong thế giới thực. ARCore tự động điều chỉnh giá trị tư thế của một Anchor khi tính năng theo dõi chuyển động được cải thiện theo thời gian.

Neo trên đám mây là các Neo được lưu trữ trên đám mây. Nhiều người dùng có thể giải quyết các vấn đề này để thiết lập một khung tham chiếu chung cho người dùng và thiết bị của họ.

Lưu trữ một điểm neo

Khi một điểm neo được lưu trữ, những điều sau đây sẽ xảy ra:

  1. Tư thế của Anchor so với thế giới được tải lên đám mây và bạn sẽ nhận được một Cloud Anchor ID.
    Cloud Anchor ID là một chuỗi mà bạn cần gửi cho bất kỳ ai muốn phân giải neo này.
  2. Một tập dữ liệu chứa dữ liệu trực quan cho neo được tải lên các máy chủ của Google.
    Tập dữ liệu này chứa dữ liệu trực quan mà thiết bị đã thấy gần đây. Di chuyển thiết bị một chút để chụp khu vực xung quanh điểm neo từ nhiều góc nhìn trước khi lưu trữ sẽ giúp định vị chính xác hơn.

Chuyển mã nhận dạng Neo đám mây

Trong lớp học lập trình này, bạn sẽ chuyển mã nhận dạng Cloud Anchor bằng Firebase. Bạn có thể chia sẻ mã nhận dạng Neo trên đám mây bằng các phương tiện khác.

Phân giải một điểm neo

Bạn có thể dùng Cloud Anchor API để phân giải một neo bằng Cloud Anchor ID của neo đó. Thao tác này sẽ tạo một neo mới ở cùng vị trí thực tế với neo được lưu trữ ban đầu. Trong khi phân giải, thiết bị phải xem xét cùng một môi trường thực tế như neo được lưu trữ ban đầu.

Neo đám mây cố định

Trước phiên bản 1.20, Cloud Anchor chỉ có thể được phân giải trong 24 giờ sau khi được lưu trữ. Với Persistent Cloud Anchors API, bạn có thể tạo một neo trên đám mây có thể được phân giải trong khoảng thời gian từ 1 ngày đến 365 ngày sau khi tạo.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ xây dựng dựa trên một ứng dụng ARCore có sẵn. Khi kết thúc lớp học lập trình này, ứng dụng của bạn sẽ:

  • Có thể lưu trữ Cloud Anchor cố định và lấy mã nhận dạng Cloud Anchor.
  • Lưu mã nhận dạng Neo đám mây trên thiết bị để dễ dàng truy xuất bằng SharedPreferences Android.
  • Sử dụng mã nhận dạng Cloud Anchor đã lưu để phân giải các neo được lưu trữ trước đó. Điều này giúp chúng ta dễ dàng mô phỏng trải nghiệm nhiều người dùng trên một thiết bị duy nhất cho mục đích của lớp học lập trình này.
  • Chia sẻ mã nhận dạng Neo trên đám mây với một thiết bị khác đang chạy cùng một ứng dụng, để nhiều người dùng nhìn thấy bức tượng Android ở cùng một vị trí.

Một bức tượng Android được kết xuất tại vị trí của Cloud Anchor:

Kiến thức bạn sẽ học được

  • Cách lưu trữ các neo bằng ARCore SDK và lấy mã nhận dạng Neo trên đám mây.
  • Cách sử dụng mã nhận dạng Cloud Anchor để phân giải Anchor.
  • Cách lưu trữ và chia sẻ mã nhận dạng Cloud Anchor giữa các phiên thực tế tăng cường trên cùng một thiết bị hoặc trên các thiết bị khác nhau.

Bạn cần có

2. Thiết lập môi trường phát triển

Thiết lập máy phát triển

Kết nối thiết bị ARCore với máy tính bằng cáp USB. Đảm bảo rằng thiết bị của bạn cho phép gỡ lỗi qua USB.

Mở một cửa sổ dòng lệnh rồi chạy adb devices, như minh hoạ dưới đây:

adb devices

List of devices attached
<DEVICE_SERIAL_NUMBER>    device

<DEVICE_SERIAL_NUMBER> sẽ là một chuỗi dành riêng cho thiết bị của bạn. Đảm bảo rằng bạn thấy chỉ một thiết bị trước khi tiếp tục.

Tải xuống và cài đặt mã

Bạn có thể sao chép kho lưu trữ:

git clone https://github.com/googlecodelabs/arcore-cloud-anchors.git

Hoặc tải tệp ZIP xuống rồi giải nén:

Mở Android Studio. Nhấp vào Open an existing Android Studio project (Mở một dự án hiện có trong Android Studio). Sau đó, hãy chuyển đến thư mục nơi bạn giải nén tệp zip đã tải xuống ở trên rồi nhấp đúp vào thư mục arcore-cloud-anchors.

Đây là một dự án Gradle duy nhất có nhiều mô-đun. Nếu ngăn Dự án ở trên cùng bên trái của Android Studio chưa xuất hiện trong ngăn Dự án, hãy nhấp vào Projects (Dự án) trong trình đơn thả xuống. Kết quả sẽ có dạng như sau:

52282f0415fdbdcb.png

Bạn sẽ chủ yếu làm việc trong mô-đun work. Các mô-đun khác bao gồm mô-đun helpers chứa một tập hợp các lớp trình bao bọc hữu ích mà bạn sẽ sử dụng. Ngoài ra, còn có các giải pháp hoàn chỉnh cho từng phần của lớp học lập trình. Ngoại trừ mô-đun helpers, mỗi mô-đun là một ứng dụng có thể tạo.

Nếu bạn thấy một hộp thoại đề xuất nâng cấp Trình bổ trợ Android cho Gradle, hãy nhấp vào Đừng nhắc lại cho dự án này:

31a93c7e9cc58b53.png

Nhấp vào Run > Run... > "công việc". Trong hộp thoại Select Deployment Target (Chọn mục tiêu triển khai) xuất hiện, thiết bị của bạn sẽ có trong phần Connected Devices (Thiết bị đã kết nối). Chọn thiết bị của bạn rồi nhấp vào OK. Android Studio sẽ tạo ứng dụng ban đầu và chạy ứng dụng đó trên thiết bị của bạn.

Trong lần đầu chạy ứng dụng, ứng dụng sẽ yêu cầu quyền CAMERA. Nhấn vào CHO PHÉP để tiếp tục.

f7ea81f71a4b969e.png

Cách sử dụng ứng dụng

  1. Di chuyển thiết bị để giúp ứng dụng tìm thấy một mặt phẳng. Mặt phẳng sẽ xuất hiện dưới dạng một bề mặt có dấu chấm khi được tìm thấy.
  2. Nhấn vào một vị trí trên mặt phẳng để đặt điểm neo. Một biểu tượng Android sẽ được vẽ tại vị trí đặt điểm neo. Ứng dụng này chỉ cho phép bạn đặt một điểm neo tại một thời điểm.
  3. Di chuyển thiết bị. Hình ảnh sẽ xuất hiện ở cùng một vị trí ngay cả khi thiết bị di chuyển.
  4. Nhấn nút XOÁ để xoá điểm neo. Thao tác này sẽ cho phép bạn đặt một điểm neo khác.

Hiện tại, ứng dụng này chỉ sử dụng tính năng theo dõi chuyển động do ARCore cung cấp để theo dõi một điểm neo trong một lần chạy ứng dụng. Nếu bạn quyết định thoát, đóng và khởi động lại ứng dụng, thì điểm neo đã đặt trước đó và mọi thông tin liên quan đến điểm neo đó (kể cả tư thế) sẽ bị mất.

Trong một vài phần tiếp theo, bạn sẽ tạo ứng dụng này để xem cách chia sẻ các neo trên nhiều phiên thực tế tăng cường.

3. Tổ chức một buổi phát sóng trực tiếp

Trong phần này, bạn sẽ sửa đổi dự án work để lưu trữ một neo. Trước khi viết mã, bạn cần triển khai một số điểm sửa đổi cho cấu hình của ứng dụng.

Khai báo quyền INTERNET

Vì Cloud Anchor cần giao tiếp với dịch vụ ARCore Cloud Anchor API, nên ứng dụng của bạn phải có quyền truy cập vào Internet.

Trong tệp AndroidManifest.xml, hãy thêm dòng sau ngay bên dưới phần khai báo quyền android.permission.CAMERA:

<!-- Find this line... -->
<uses-permission android:name="android.permission.CAMERA"/>

<!-- Add the line right below -->
<uses-permission android:name="android.permission.INTERNET"/>

Bật ARCore API

  1. Chuyển đến trang dịch vụ ARCore API.
  2. Trong danh sách dự án, hãy chọn một dự án hoặc tạo một dự án mới.
  3. Nhấp vào Bật.

Thiết lập chế độ xác thực không cần khoá

Để sử dụng Neo đám mây cố định, bạn cần sử dụng phương thức xác thực không cần khoá để xác thực bằng ARCore API.

  1. Truy cập vào Bảng điều khiển Google Cloud Platform.
  2. Trong danh sách dự án, hãy chọn một dự án.
  3. Nếu trang API và dịch vụ chưa mở, hãy mở trình đơn bên trái của bảng điều khiển rồi chọn API và dịch vụ.
  4. Ở bên trái, hãy nhấp vào Thông tin đăng nhập.
  5. Nhấp vào Tạo thông tin đăng nhập, sau đó chọn Mã ứng dụng khách OAuth.
  6. Điền các giá trị sau:
    • Loại ứng dụng: Android
    • Tên gói: com.google.ar.core.codelab.cloudanchor
  7. Truy xuất dấu vân tay chứng chỉ ký gỡ lỗi:
    1. Trong dự án Android Studio, hãy mở Gradle toolpane (bảng công cụ Gradle).
    2. Trong cloud-anchors > work > Tasks > android (neo trên đám mây > work > Tasks > android), hãy chạy tác vụ signingReport.
    3. Sao chép dấu vân tay SHA-1 vào trường Dấu vân tay chứng chỉ SHA-1 trong Google Cloud.

Định cấu hình ARCore

Tiếp theo, bạn sẽ sửa đổi ứng dụng để lưu trữ một neo khi người dùng nhấn vào thay vì một neo thông thường. Để làm được việc đó, bạn cần định cấu hình Phiên ARCore để bật Neo trên đám mây.

Trong tệp CloudAnchorFragment.java, hãy thêm đoạn mã sau:

// Find this line...
session = new Session(requireActivity());

// Add these lines right below:
// Configure the session.
Config config = new Config(session);
config.setCloudAnchorMode(CloudAnchorMode.ENABLED);
session.configure(config);

Trước khi tiếp tục, hãy tạo và chạy ứng dụng của bạn. Đảm bảo bạn chỉ tạo mô-đun work. Ứng dụng của bạn sẽ được tạo thành công và chạy như trước đây.

Tổ chức một buổi Hỏi và đáp

Đã đến lúc lưu trữ một neo sẽ được tải lên ARCore API.

Thêm trường mới sau đây vào lớp CloudAnchorFragment:

// Find this line...
private Anchor currentAnchor = null;

// Add these lines right below.
@Nullable
private Future future = null;

Hãy nhớ thêm dữ liệu nhập cho com.google.ar.core.Future.

Sửa đổi phương thức onClearButtonPressed như sau:

private void onClearButtonPressed() {
  // Clear the anchor from the scene.
  if (currentAnchor != null) {
    currentAnchor.detach();
    currentAnchor = null;
  }

  // The next part is the new addition.
  // Cancel any ongoing asynchronous operations.
  if (future != null) {
    future.cancel();
    future = null;
  }
}

Tiếp theo, hãy thêm phương thức sau vào lớp CloudAnchorFragment của bạn:

private void onHostComplete(String cloudAnchorId, CloudAnchorState cloudState) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Hosted. ID: " + cloudAnchorId);
  } else {
    messageSnackbarHelper.showMessage(getActivity(), "Error while hosting: " + cloudState.toString());
  }
}

Tìm phương thức handleTap trong lớp CloudAnchorFragment rồi thêm các dòng sau:

// Find this line...
currentAnchor = hit.createAnchor();

// Add these lines right below:
messageSnackbarHelper.showMessage(getActivity(), "Now hosting anchor...");
future = session.hostCloudAnchorAsync(currentAnchor, 300, this::onHostComplete);

Chạy lại ứng dụng trong Android Studio. Bạn sẽ thấy thông báo "Đang lưu trữ neo..." khi đặt một neo. Bạn sẽ thấy một thông báo khác khi quá trình lưu trữ hoàn tất thành công. Nếu bạn thấy "Error hosting anchor: ERROR_NOT_AUTHORIZED", hãy xác minh rằng bạn đã định cấu hình ứng dụng OAuth đúng cách.

Bất kỳ ai biết mã nhận dạng điểm neo và có mặt trong cùng không gian thực với điểm neo đều có thể dùng mã nhận dạng điểm neo để tạo một điểm neo ở tư thế (vị trí và hướng) chính xác tương tự so với môi trường xung quanh họ.

Tuy nhiên, mã nhận dạng điểm neo này rất dài và người dùng khác khó có thể nhập theo cách thủ công. Trong các phần sau, bạn sẽ lưu trữ mã nhận dạng Cloud Anchor theo cách dễ dàng truy xuất để cho phép giải quyết neo trên cùng một hoặc một thiết bị khác.

4. Mã nhận dạng cửa hàng và Resolve Anchors

Trong phần này, bạn sẽ chỉ định mã ngắn cho mã nhận dạng Cloud Anchor dài để người dùng khác dễ dàng nhập mã theo cách thủ công. Bạn sẽ dùng API Shared Preferences để lưu trữ mã nhận dạng Cloud Anchor dưới dạng các giá trị trong một bảng khoá-giá trị. Bảng này sẽ vẫn tồn tại ngay cả khi ứng dụng bị tắt và khởi động lại.

Một lớp trợ giúp có tên là StorageManager đã được cung cấp cho bạn. Đây là một trình bao bọc xung quanh API SharedPreferences có các phương thức để tạo mã ngắn duy nhất mới và đọc/ghi mã nhận dạng Cloud Anchor.

Sử dụng StorageManager

Sửa đổi CloudAnchorFragment để sử dụng StorageManager nhằm lưu trữ mã nhận dạng Cloud Anchor bằng mã ngắn, nhờ đó, bạn có thể dễ dàng truy xuất các mã này.

Tạo trường mới sau đây trong CloudAnchorFragment:

// Find this line...
private TapHelper tapHelper;

// And add the storageManager.
private final StorageManager storageManager = new StorageManager();

Sau đó, sửa đổi phương thức onHostComplete:

private void onHostComplete(String cloudAnchorId, CloudAnchorState cloudState) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    int shortCode = storageManager.nextShortCode(getActivity());
    storageManager.storeUsingShortCode(getActivity(), shortCode, anchor.getCloudAnchorId());
    messageSnackbarHelper.showMessage(
        getActivity(), "Cloud Anchor Hosted. Short code: " + shortCode);
  } else {
    messageSnackbarHelper.showMessage(getActivity(), "Error while hosting: " + cloudState.toString());
  }
}

Giờ đây, bạn có thể tạo và chạy ứng dụng trong Android Studio. Bạn sẽ thấy mã ngắn xuất hiện thay vì mã nhận dạng Cloud Anchor dài khi tạo và lưu trữ một neo.

Ngay sau khi đặt một điểm neo

Sau khi chờ một lúc

Xin lưu ý rằng mã ngắn do StorageManager tạo hiện luôn được chỉ định theo thứ tự tăng dần.

Tiếp theo, bạn sẽ thêm một số phần tử giao diện người dùng cho phép bạn nhập mã ngắn và tạo lại các neo.

Thêm nút Giải quyết

Bạn sẽ thêm một nút khác bên cạnh nút CLEAR (XOÁ). Đây sẽ là nút GIẢI QUYẾT. Khi nhấp vào nút RESOLVE (GIẢI QUYẾT), một hộp thoại sẽ mở ra để nhắc người dùng nhập mã ngắn. Mã ngắn được dùng để truy xuất mã nhận dạng Cloud Anchor từ StorageManager và phân giải neo.

Để thêm nút này, bạn cần sửa đổi tệp res/layout/cloud_anchor_fragment.xml. Trong Android Studio, hãy nhấp đúp vào tệp, sau đó nhấp vào thẻ "Text" (Văn bản) ở dưới cùng để hiển thị XML thô. Thực hiện các sửa đổi sau:

<!-- Find this element. -->
<Button
    android:text="CLEAR"
    android:id="@+id/clear_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<!-- Add this element right below. -->
<Button
    android:text="RESOLVE"
    android:id="@+id/resolve_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Bây giờ, hãy thêm một trường mới vào CloudAnchorFragment:

private Button resolveButton;

Thêm một phương thức mới:

private void onResolveButtonPressed() {
  ResolveDialogFragment dialog = new ResolveDialogFragment();
  dialog.show(getFragmentMagetActivity().getSupportFragmentManagernager(), "Resolve");
}

Khởi tạo resolveButton trong phương thức onCreateView như sau:

// Find these lines...
Button clearButton = rootView.findViewById(R.id.clear_button);
clearButton.setOnClickListener(v -> onClearButtonPressed());

// Add these lines right below.
resolveButton = rootView.findViewById(R.id.resolve_button);
resolveButton.setOnClickListener(v -> onResolveButtonPressed());

Tìm phương thức handleTap rồi sửa đổi phương thức đó:

private void handleTap(Frame frame, Camera camera) {
  // ...

  // Find this line.
  currentAnchor = hit.createAnchor();

  // Add this line right below.
  getActivity().runOnUiThread(() -> resolveButton.setEnabled(false)); 
}

Thêm một dòng vào phương thức onClearButtonPressed:

private void onClearButtonPressed() {
  // Clear the anchor from the scene.
    if (currentAnchor != null) {
      currentAnchor.detach();
      currentAnchor = null;
    }

    // Cancel any ongoing async operations.
    if (future != null) {
      future.cancel();
      future = null;
    }

  // The next line is the new addition.
  resolveButton.setEnabled(true);
}

Tạo và chạy ứng dụng trong Android Studio. Bạn sẽ thấy nút GIẢI QUYẾT bên cạnh nút XOÁ. Khi bạn nhấp vào nút RESOLVE (GIẢI QUYẾT), một hộp thoại sẽ bật lên như minh hoạ bên dưới.

Nút GIẢI QUYẾT hiện đã xuất hiện

Khi người dùng nhấp vào nút này, hộp thoại này sẽ xuất hiện

Việc nhấn vào mặt phẳng và lưu trữ một neo sẽ vô hiệu hoá nút RESOLVE (GIẢI QUYẾT), nhưng việc nhấn vào nút CLEAR (XOÁ) sẽ bật lại nút này. Đây là thiết kế để chỉ có một neo trong cảnh tại một thời điểm.

Hộp thoại "Resolve Anchor" (Giải quyết điểm neo) không làm gì cả, nhưng giờ bạn sẽ thay đổi điều đó.

Phân giải các neo

Thêm các phương thức sau vào lớp CloudAnchorFragment:

private void onShortCodeEntered(int shortCode) {
  String cloudAnchorId = storageManager.getCloudAnchorId(getActivity(), shortCode);
  if (cloudAnchorId == null || cloudAnchorId.isEmpty()) {
    messageSnackbarHelper.showMessage(
        getActivity(),
        "A Cloud Anchor ID for the short code " + shortCode + " was not found.");
    return;
  }
  resolveButton.setEnabled(false);
  future = session.resolveCloudAnchorAsync(
      cloudAnchorId, (anchor, cloudState) -> onResolveComplete(anchor, cloudState, shortCode));
}

private void onResolveComplete(Anchor anchor, CloudAnchorState cloudState, int shortCode) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Resolved. Short code: " + shortCode);
    currentAnchor = anchor;
  } else {
    messageSnackbarHelper.showMessage(
        getActivity(),
        "Error while resolving anchor with short code "
            + shortCode
            + ". Error: "
            + cloudState.toString());
    resolveButton.setEnabled(true);
  }
}

Sau đó, hãy sửa đổi phương thức onResolveButtonPressed:

private void onResolveButtonPressed() {
  ResolveDialogFragment dialog = ResolveDialogFragment.createWithOkListener(
      this::onShortCodeEntered);
  dialog.show(getActivity().getSupportFragmentManager(), "Resolve");
}

Tạo và chạy ứng dụng trong Android Studio, rồi thực hiện các bước sau:

  1. Tạo một điểm neo trên mặt phẳng và đợi điểm neo được lưu trữ.
    Ghi nhớ mã ngắn.
  2. Nhấn nút CLEAR (XOÁ) để xoá điểm neo.
  3. Nhấn nút GIẢI QUYẾT. Nhập mã ngắn trong bước 1.
  4. Bạn sẽ thấy một điểm neo ở cùng vị trí so với môi trường như khi bạn đặt điểm neo ban đầu.
  5. Thoát và đóng ứng dụng, sau đó mở lại.
  6. Lặp lại bước (3) và (4). Bạn sẽ thấy một điểm neo mới, vẫn ở cùng vị trí.

Nhập mã ngắn

Đã giải quyết thành công điểm neo

5. Chia sẻ giữa các thiết bị

Bạn đã thấy cách lưu trữ Cloud Anchor ID của một neo vào bộ nhớ cục bộ của thiết bị và truy xuất sau này để tạo lại cùng một neo. Tuy nhiên, bạn chỉ có thể khai thác hết tiềm năng của Neo đám mây khi chia sẻ được mã nhận dạng Neo đám mây giữa các thiết bị.

Bạn có thể tự quyết định cách ứng dụng của mình chia sẻ mã nhận dạng neo trên đám mây. Bạn có thể dùng bất cứ thứ gì để chuyển chuỗi từ thiết bị này sang thiết bị khác. Trong lớp học lập trình này, bạn sẽ sử dụng Cơ sở dữ liệu theo thời gian thực của Firebase để chuyển mã nhận dạng Neo trên đám mây giữa các phiên bản của ứng dụng.

Thiết lập Firebase

Bạn cần thiết lập một Cơ sở dữ liệu theo thời gian thực của Firebase bằng tài khoản Google để sử dụng với ứng dụng này. Việc này rất dễ dàng nhờ Trợ lý Firebase trong Android Studio.

Trong Android Studio, hãy nhấp vào Tools > Firebase (Công cụ > Firebase). Trong ngăn Trợ lý bật lên, hãy nhấp vào Cơ sở dữ liệu theo thời gian thực, rồi nhấp vào Lưu và truy xuất dữ liệu:

68e927cbf324a3b2.png

Nhấp vào nút Kết nối với Firebase để kết nối dự án Android Studio của bạn với một dự án Firebase mới hoặc hiện có.

63f3b1ffd6bd263e.png

Thao tác này sẽ nhắc bạn chọn một mô-đun. Chọn mô-đun work:

be737c689ad6dd78.png

Hộp thoại Bắt đầu kết nối sẽ xuất hiện. Quá trình này có thể mất chút thời gian.

b48626f8672551ee.png

Đăng nhập bằng Tài khoản Google của bạn và thực hiện quy trình trên web để tạo một dự án Firebase cho ứng dụng cho đến khi bạn quay lại Android Studio.

Tiếp theo, trong ngăn Trợ lý, hãy nhấp vào thêm Cơ sở dữ liệu theo thời gian thực vào ứng dụng của bạn:

68e0843fa2531c4c.png

Trong hộp thoại bật lên, hãy chọn work trong trình đơn thả xuống Target module (Mô-đun đích), rồi nhấp vào Accept Changes (Chấp nhận thay đổi).

155fd89533c02671.png

Thao tác này sẽ:

  1. Thêm tệp google-services.json vào thư mục work
  2. Thêm một vài dòng vào tệp build.gradle trong cùng thư mục.
  3. Tạo và chạy ứng dụng (bạn có thể thấy lỗi phân giải về số phiên bản cơ sở dữ liệu Firebase).

Trong tệp build.gradle của mô-đun work, hãy tìm và xoá dòng sau (xxxx là phần giữ chỗ cho số phiên bản mới nhất)

dependencies {
  ...
  implementation 'com.google.firebase:firebase-database:xxxx'

Tiếp theo, hãy xem (nhưng chưa làm theo) hướng dẫn được liên kết từ trang định cấu hình quy tắc để truy cập công khai để định cấu hình Cơ sở dữ liệu theo thời gian thực của Firebase có thể ghi trên toàn cầu. Điều này giúp đơn giản hoá việc kiểm thử trong lớp học lập trình này:

666ebefd39019c05.png

Trên Bảng điều khiển của Firebase, hãy chọn dự án mà bạn đã kết nối với dự án Android Studio, sau đó chọn BUILD (XÂY DỰNG) > Realtime Database (Cơ sở dữ liệu theo thời gian thực).

Vị trí của Cơ sở dữ liệu theo thời gian thực của Firebase

Nhấp vào Tạo cơ sở dữ liệu để định cấu hình và thiết lập Cơ sở dữ liệu theo thời gian thực:

Tạo cơ sở dữ liệu

Chọn vị trí bất kỳ cho cơ sở dữ liệu.

Trong bước tiếp theo, hãy chọn các quy tắc bảo mật ở chế độ kiểm thử rồi nhấp vào Bật:

Bảo mật cơ sở dữ liệu

Giờ đây, ứng dụng của bạn đã được định cấu hình để sử dụng cơ sở dữ liệu Firebase.

Sử dụng FirebaseManager

Bây giờ, bạn sẽ thay thế StorageManager bằng FirebaseManager.

Trong Android Studio, hãy tìm lớp CloudAnchorFragment trong thư mục work. Thay thế StorageManager bằng FirebaseManager:

// Find this line.
private final StorageManager storageManager = new StorageManager();

// And replace it with this line.
private FirebaseManager firebaseManager;

Khởi tạo firebaseManager trong phương thức onAttach:

public void onAttach(@NonNull Context context) {
  super.onAttach(context);
  tapHelper = new TapHelper(context);
  trackingStateHelper = new TrackingStateHelper(requireActivity());

  // The next line is the new addition.
  firebaseManager = new FirebaseManager(context);
}

Sửa đổi phương thức onShortCodeEntered như sau:

private void onShortCodeEntered(int shortCode) {
  firebaseManager.getCloudAnchorId(shortCode, cloudAnchorId -> {
    if (cloudAnchorId == null || cloudAnchorId.isEmpty()) {
      messageSnackbarHelper.showMessage(
          getActivity(),
          "A Cloud Anchor ID for the short code " + shortCode + " was not found.");
      return;
    }
    resolveButton.setEnabled(false);
    future = session.resolveCloudAnchorAsync(
        cloudAnchorId, (anchor, cloudState) -> onResolveComplete(anchor, cloudState, shortCode));
  });
}

Sau đó, sửa đổi phương thức onHostComplete như sau:

private void onHostComplete(String cloudAnchorId, CloudAnchorState cloudState) {
  if (cloudState == CloudAnchorState.SUCCESS) {
    firebaseManager.nextShortCode(shortCode -> {
      if (shortCode != null) {
        firebaseManager.storeUsingShortCode(shortCode, cloudAnchorId);
        messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Hosted. Short code: " + shortCode);
      } else {
        // Firebase could not provide a short code.
        messageSnackbarHelper.showMessage(getActivity(), "Cloud Anchor Hosted, but could not "
            + "get a short code from Firebase.");
      }
    });
  } else {
    messageSnackbarHelper.showMessage(getActivity(), "Error while hosting: " + cloudState.toString());
  }
}

Tạo và chạy ứng dụng. Bạn sẽ thấy quy trình giao diện người dùng tương tự như trong phần trước, ngoại trừ việc giờ đây, cơ sở dữ liệu Firebase trực tuyến đang được dùng để lưu trữ mã ngắn và mã nhận dạng Cloud Anchor thay vì bộ nhớ cục bộ trên thiết bị.

Kiểm thử nhiều người dùng

Để kiểm thử trải nghiệm nhiều người dùng, hãy dùng 2 điện thoại riêng biệt:

  1. Cài đặt ứng dụng trên hai thiết bị.
  2. Sử dụng một thiết bị để lưu trữ một điểm neo và tạo mã ngắn.
  3. Dùng thiết bị kia để phân giải điểm neo bằng mã ngắn đó.

Bạn có thể lưu trữ các neo trên một thiết bị, lấy mã ngắn và sử dụng mã ngắn đó trên thiết bị kia để xem neo ở cùng một vị trí!

6. Tóm tắt

Xin chúc mừng! Bạn đã hoàn thành lớp học lập trình này!

Nội dung đã đề cập

  • Cách lưu trữ các neo bằng ARCore SDK và lấy mã nhận dạng Neo trên đám mây.
  • Cách sử dụng mã nhận dạng Cloud Anchor để phân giải Anchor.
  • Cách lưu trữ và chia sẻ mã nhận dạng Cloud Anchor giữa các phiên thực tế tăng cường trên cùng một thiết bị hoặc trên các thiết bị khác nhau.

Tìm hiểu thêm