ARCore Cloud Anchors با Cloud Anchors دائمی

۱. مرور کلی

ARCore پلتفرمی برای ساخت برنامه‌های واقعیت افزوده روی دستگاه‌های تلفن همراه است. رابط برنامه‌نویسی کاربردی Cloud Anchors به ​​شما این امکان را می‌دهد که برنامه‌های AR ایجاد کنید که یک چارچوب مرجع مشترک را به اشتراک می‌گذارند و به چندین کاربر امکان می‌دهند محتوای مجازی را در یک مکان واقعی قرار دهند.

این آزمایشگاه کد شما را در استفاده از API مربوط به Cloud Anchors راهنمایی می‌کند. شما یک برنامه ARCore موجود را انتخاب می‌کنید، آن را برای استفاده از Cloud Anchors تغییر می‌دهید و یک تجربه AR مشترک ایجاد می‌کنید.

انکرهای ARCore و انکرهای ابری پایدار

یک مفهوم اساسی در ARCore، مفهوم Anchor است که یک موقعیت ثابت را در دنیای واقعی توصیف می‌کند. ARCore به طور خودکار مقدار ژست Anchor را با بهبود ردیابی حرکت آن در طول زمان تنظیم می‌کند.

انکرهای ابری، انکرهایی هستند که در فضای ابری میزبانی می‌شوند. آن‌ها می‌توانند توسط چندین کاربر حل شوند تا یک چارچوب مرجع مشترک بین کاربران و دستگاه‌هایشان ایجاد شود.

میزبانی از یک لنگر

وقتی یک انکر میزبانی می‌شود، اتفاقات زیر رخ می‌دهد:

  1. موقعیت لنگر نسبت به جهان در فضای ابری آپلود می‌شود و یک شناسه لنگر ابری (Cloud Anchor ID) به دست می‌آید.
    شناسه لنگر ابری (Cloud Anchor ID) رشته‌ای است که باید برای هر کسی که می‌خواهد این لنگر را حل کند، ارسال شود.
  2. یک مجموعه داده حاوی داده‌های بصری برای انکر در سرورهای گوگل آپلود می‌شود.
    این مجموعه داده شامل داده‌های بصری است که اخیراً توسط دستگاه مشاهده شده است. کمی حرکت دادن دستگاه برای ثبت ناحیه اطراف لنگر از دیدگاه‌های مختلف قبل از میزبانی، منجر به محلی‌سازی بهتر خواهد شد.

انتقال شناسه‌های Cloud Anchor

در این آزمایشگاه کد، شما شناسه‌های Cloud Anchor را با استفاده از Firebase منتقل خواهید کرد. شما می‌توانید شناسه‌های Cloud Anchor را با استفاده از روش‌های دیگر به اشتراک بگذارید.

حل یک لنگر

شما می‌توانید از API مربوط به Cloud Anchor برای حل یک anchor با استفاده از شناسه Cloud Anchor آن استفاده کنید. این کار یک anchor جدید در همان مکان فیزیکی anchor میزبانی شده اصلی ایجاد می‌کند. هنگام حل کردن، دستگاه باید به همان محیط فیزیکی anchor میزبانی شده اصلی نگاه کند.

لنگرهای ابری پایدار

قبل از نسخه ۱.۲۰، لنگرهای ابری فقط ۲۴ ساعت پس از میزبانی قابل حل بودند. با استفاده از رابط برنامه‌نویسی کاربردی لنگرهای ابری پایدار، می‌توانید لنگر ابری ایجاد کنید که از ۱ روز تا ۳۶۵ روز پس از ایجاد قابل حل باشد.

آنچه خواهید ساخت

در این آزمایشگاه کد، شما بر اساس یک برنامه ARCore از پیش موجود، برنامه خود را خواهید ساخت. در پایان آزمایشگاه کد، برنامه شما:

  • قادر به میزبانی Cloud Anchors پایدار و دریافت شناسه‌های Cloud Anchor باشید.
  • شناسه‌های Cloud Anchor را برای بازیابی آسان با استفاده از Android SharedPreferences روی دستگاه ذخیره کنید.
  • از شناسه‌های ذخیره‌شده‌ی Cloud Anchor برای حل کردن anchorهای میزبانی‌شده‌ی قبلی استفاده کنید. این کار شبیه‌سازی یک تجربه‌ی چندکاربره با یک دستگاه واحد را برای اهداف این codelab برای ما آسان می‌کند.
  • شناسه‌های Cloud Anchor را با دستگاه دیگری که همان برنامه را اجرا می‌کند به اشتراک بگذارید، بنابراین چندین کاربر مجسمه اندروید را در موقعیت یکسانی مشاهده می‌کنند.

یک مجسمه اندروید در موقعیت Cloud Anchor رندر شده است:

آنچه یاد خواهید گرفت

  • نحوه میزبانی Anchors با استفاده از ARCore SDK و دریافت شناسه Cloud Anchor.
  • نحوه استفاده از شناسه‌های لنگر ابری برای حل لنگرها.
  • نحوه ذخیره و اشتراک‌گذاری شناسه‌های Cloud Anchor بین جلسات مختلف AR در همان دستگاه یا در دستگاه‌های مختلف.

آنچه نیاز دارید

۲. محیط توسعه خود را تنظیم کنید

راه‌اندازی دستگاه توسعه

دستگاه ARCore خود را از طریق کابل USB به رایانه متصل کنید. مطمئن شوید که دستگاه شما از اشکال‌زدایی USB پشتیبانی می‌کند .

یک ترمینال باز کنید و adb devices اجرا کنید، همانطور که در زیر نشان داده شده است:

adb devices

List of devices attached
<DEVICE_SERIAL_NUMBER>    device

<DEVICE_SERIAL_NUMBER> یک رشته منحصر به فرد برای دستگاه شما خواهد بود. قبل از ادامه، مطمئن شوید که دقیقاً یک دستگاه را مشاهده می‌کنید.

دانلود و نصب کد

می‌توانید مخزن را کلون کنید:

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

یا یک فایل زیپ دانلود کنید و آن را از حالت فشرده خارج کنید:

اندروید استودیو را اجرا کنید. روی «باز کردن یک پروژه اندروید استودیو موجود» کلیک کنید. سپس، به پوشه‌ای که فایل زیپ دانلود شده در بالا را در آن استخراج کرده‌اید بروید و روی پوشه arcore-cloud-anchors دوبار کلیک کنید.

این یک پروژه Gradle با چندین ماژول است. اگر پنجره Project در سمت چپ بالای Android Studio از قبل در پنجره Project نمایش داده نشده است، از منوی کشویی روی Projects کلیک کنید. نتیجه باید مانند این باشد:

52282f0415fdbdcb.png

شما عمدتاً در ماژول work module) کار خواهید کرد. ماژول‌های دیگر شامل ماژول helpers هستند که شامل مجموعه‌ای از کلاس‌های wrapper مفید است که شما از آنها استفاده خواهید کرد. همچنین راه‌حل‌های کاملی برای هر بخش از codelab وجود دارد. به جز ماژول helpers ، هر ماژول یک برنامه قابل ساخت است.

اگر پنجره‌ای را مشاهده کردید که به شما توصیه می‌کند افزونه Android Gradle را ارتقا دهید، روی «دیگر برای این پروژه به من یادآوری نکن» کلیک کنید:

31a93c7e9cc58b53.png

روی Run > Run... > 'work' کلیک کنید. در کادر محاوره‌ای Select Deployment Target که نمایش داده می‌شود، دستگاه شما باید در زیر Connected Devices فهرست شده باشد. دستگاه خود را انتخاب کرده و روی OK کلیک کنید. اندروید استودیو برنامه اولیه را می‌سازد و آن را روی دستگاه شما اجرا می‌کند.

وقتی برای اولین بار برنامه را اجرا می‌کنید، از شما اجازه CAMERA را درخواست می‌کند. برای ادامه، روی «مجاز» (ALLOW) ضربه بزنید.

f7ea81f71a4b969e.png

نحوه استفاده از برنامه

  1. دستگاه را حرکت دهید تا به برنامه در یافتن صفحه کمک کنید . وقتی صفحه‌ای پیدا شود، به صورت یک سطح نقطه‌چین نشان داده می‌شود.
  2. برای قرار دادن لنگر، روی جایی از صفحه ضربه بزنید . یک شکل اندروید در جایی که لنگر قرار داده شده است، رسم می‌شود. این برنامه فقط به شما امکان می‌دهد هر بار یک لنگر قرار دهید.
  3. دستگاه را حرکت دهید . شکل باید در همان مکان باقی بماند، حتی اگر دستگاه در حال حرکت باشد.
  4. دکمه CLEAR را برای برداشتن لنگر فشار دهید . این به شما امکان می‌دهد تا لنگر دیگری قرار دهید.

در حال حاضر، این برنامه فقط از ردیابی حرکت ارائه شده توسط ARCore برای ردیابی یک لنگر در یک اجرای برنامه استفاده می‌کند. اگر تصمیم به ترک، کشتن و راه‌اندازی مجدد برنامه بگیرید، لنگر قبلی قرار داده شده و هرگونه اطلاعات مربوط به آن، از جمله موقعیت آن، از بین خواهد رفت.

در چند بخش بعدی، شما بر اساس این برنامه، نحوه اشتراک‌گذاری انکرها در جلسات واقعیت افزوده را خواهید دید.

۳. میزبان یک گوینده باشید

در این بخش، پروژه work را برای میزبانی یک anchor تغییر خواهید داد. قبل از نوشتن کد، باید چند تغییر در پیکربندی برنامه اعمال کنید.

مجوزهای اینترنتی را اعلام کنید

از آنجا که Cloud Anchors نیاز به ارتباط با سرویس API ARCore Cloud Anchor دارد، برنامه شما باید اجازه دسترسی به اینترنت را داشته باشد.

در فایل AndroidManifest.xml خود، خط زیر را درست زیر اعلان مجوز 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"/>

فعال کردن API ARCore

  1. به صفحه سرویس ARCore API بروید.
  2. در لیست پروژه‌ها، یک پروژه را انتخاب کنید یا یک پروژه جدید ایجاد کنید.
  3. روی فعال کردن کلیک کنید.

تنظیم احراز هویت بدون کلید

برای استفاده از Persistent Cloud Anchors، باید از احراز هویت بدون کلید برای تأیید اعتبار با API ARCore استفاده کنید.

  1. به کنسول پلتفرم ابری گوگل بروید.
  2. از لیست پروژه‌ها، یک پروژه را انتخاب کنید.
  3. اگر صفحه APIها و خدمات از قبل باز نشده است، منوی سمت چپ کنسول را باز کنید و APIها و خدمات را انتخاب کنید.
  4. در سمت چپ، روی «اعتبارنامه‌ها» کلیک کنید.
  5. روی «ایجاد اعتبارنامه‌ها» کلیک کنید، سپس شناسه کلاینت OAuth را انتخاب کنید.
  6. مقادیر زیر را پر کنید:
    • نوع برنامه : اندروید
    • نام بسته : com.google.ar.core.codelab.cloudanchor
  7. اثر انگشت گواهی امضای اشکال‌زدایی خود را بازیابی کنید:
    1. در پروژه اندروید استودیو خود، پنل ابزار Gradle را باز کنید.
    2. در cloud-anchors > work > Tasks > android ، وظیفه signingReport را اجرا کنید.
    3. اثر انگشت SHA-1 را در فیلد اثر انگشت گواهی SHA-1 در Google Cloud کپی کنید.

پیکربندی ARCore

در مرحله بعد، برنامه را طوری تغییر خواهید داد که به جای یک لنگر معمولی، یک لنگر را روی یک لمس کاربر میزبانی کند. برای انجام این کار، باید جلسه ARCore را برای فعال کردن لنگرهای ابری پیکربندی کنید.

در فایل CloudAnchorFragment.java ، کد زیر را اضافه کنید:

// 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);

قبل از ادامه، برنامه خود را بسازید و اجرا کنید. مطمئن شوید که فقط ماژول work می‌سازید. برنامه شما باید با موفقیت ساخته شود و مانند قبل اجرا شود.

میزبان یک مجری باشید

وقت آن است که یک انکر (anchor) را میزبانی کنیم که قرار است در API ARCore آپلود شود.

فیلد جدید زیر را به کلاس CloudAnchorFragment خود اضافه کنید:

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

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

به یاد داشته باشید که یک import برای com.google.ar.core.Future اضافه کنید.

متد onClearButtonPressed را به صورت زیر تغییر دهید:

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;
  }
}

سپس، متد زیر را به کلاس CloudAnchorFragment خود اضافه کنید:

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());
  }
}

متد handleTap را در کلاس CloudAnchorFragment پیدا کنید و این خطوط را به آن اضافه کنید:

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

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

برنامه خود را دوباره از اندروید استودیو اجرا کنید . هنگام قرار دادن یک لنگر، باید پیام " Now hosting anchor... " را ببینید. وقتی میزبانی با موفقیت انجام شد، باید پیام دیگری ببینید. اگر " Error hosting anchor: ERROR_NOT_AUTHORIZED " را مشاهده کردید، تأیید کنید که کلاینت OAuth شما به درستی پیکربندی شده است.

هر کسی که شناسه لنگر را بداند و در همان فضای فیزیکی که لنگر حضور دارد، باشد، می‌تواند از شناسه لنگر برای ایجاد یک لنگر با همان موقعیت (موقعیت و جهت) نسبت به محیط اطراف خود استفاده کند.

با این حال، شناسه لنگر طولانی است و وارد کردن دستی آن برای کاربر دیگر آسان نیست. در بخش‌های بعدی، شناسه‌های لنگر ابری را به روشی آسان برای بازیابی ذخیره خواهید کرد تا بتوانید لنگر را در همان دستگاه یا دستگاه دیگری حل کنید.

۴. ذخیره شناسه‌ها و حل لنگرها

در این بخش، کدهای کوتاهی را به شناسه‌های طولانی Cloud Anchor اختصاص می‌دهید تا ورود دستی آنها برای کاربر دیگر آسان‌تر شود. شما از API تنظیمات اشتراکی (Shared Preferences API) برای ذخیره شناسه‌های Cloud Anchor به عنوان مقادیر در یک جدول کلید-مقدار استفاده خواهید کرد. این جدول حتی اگر برنامه بسته و مجدداً راه‌اندازی شود، باقی خواهد ماند.

یک کلاس کمکی به نام StorageManager از قبل برای شما فراهم شده است. این یک پوشش پیرامون API SharedPreferences است که متدهایی برای تولید کدهای کوتاه منحصر به فرد جدید و خواندن/نوشتن شناسه‌های Cloud Anchor دارد.

استفاده از مدیریت ذخیره‌سازی

CloudAnchorFragment طوری تغییر دهید که StorageManager برای ذخیره شناسه‌های Cloud Anchor با کدهای کوتاه استفاده کند تا بتوان آنها را به راحتی بازیابی کرد.

فیلد جدید زیر را در CloudAnchorFragment ایجاد کنید:

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

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

سپس متد 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());
  }
}

حالا، برنامه را از اندروید استودیو بسازید و اجرا کنید . هنگام ایجاد و میزبانی یک انکر، باید به جای شناسه‌های طولانی Cloud Anchor، کدهای کوتاه نمایش داده شوند.

بلافاصله پس از قرار دادن لنگر

بعد از کمی انتظار

توجه داشته باشید که کدهای کوتاه تولید شده توسط StorageManager در حال حاضر همیشه به ترتیب صعودی اختصاص داده می‌شوند.

در مرحله بعد، چند عنصر رابط کاربری اضافه خواهید کرد که به شما امکان می‌دهد کدهای کوتاه را وارد کنید و انکر تکست‌ها را دوباره ایجاد کنید.

دکمه حل مسئله را اضافه کنید

شما یک دکمه دیگر در کنار دکمه CLEAR اضافه خواهید کرد. این دکمه RESOLVE خواهد بود. کلیک بر روی دکمه RESOLVE یک کادر محاوره‌ای باز می‌کند که از کاربر یک کد کوتاه می‌خواهد. این کد کوتاه برای بازیابی شناسه Cloud Anchor از StorageManager و حل مشکل anchor استفاده می‌شود.

برای افزودن دکمه، باید فایل res/layout/cloud_anchor_fragment.xml را تغییر دهید. در اندروید استودیو، روی فایل دوبار کلیک کنید، سپس روی تب "Text" در پایین کلیک کنید تا XML خام نمایش داده شود. تغییرات زیر را انجام دهید:

<!-- 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"/>

حالا، یک فیلد جدید به CloudAnchorFragment اضافه کنید:

private Button resolveButton;

اضافه کردن یک روش جدید:

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

مقداردهی اولیه resolveButton در متد onCreateView به شرح زیر است:

// 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());

متد handleTap را پیدا کنید و آن را تغییر دهید:

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

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

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

یک خط به متد 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);
}

برنامه را از اندروید استودیو بسازید و اجرا کنید . باید دکمه RESOLVE را در کنار دکمه CLEAR ببینید. کلیک بر روی دکمه RESOLVE باید منجر به باز شدن پنجره‌ای مانند شکل زیر شود.

دکمه RESOLVE اکنون قابل مشاهده است

کلیک روی دکمه باعث می‌شود این کادر محاوره‌ای ظاهر شود

ضربه زدن روی صفحه و قرار دادن یک لنگر باید دکمه RESOLVE را غیرفعال کند، اما ضربه زدن روی دکمه CLEAR باید دوباره آن را فعال کند. این طراحی به گونه‌ای است که فقط یک لنگر در هر زمان در صحنه باشد.

کادر محاوره‌ای «حل کردن لنگر» هیچ کاری انجام نمی‌دهد، اما اکنون آن را تغییر خواهید داد.

لنگرهای حل و فصل

متدهای زیر را در کلاس 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);
  }
}

سپس، متد onResolveButtonPressed را تغییر دهید:

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

برنامه را از اندروید استودیو بسازید و اجرا کنید و مراحل زیر را انجام دهید:

  1. یک لنگر روی یک صفحه ایجاد کنید و منتظر بمانید تا لنگر میزبانی شود.
    کد کوتاه را به خاطر بسپارید.
  2. برای حذف لنگر، دکمه CLEAR را فشار دهید.
  3. دکمه RESOLVE را فشار دهید. کد کوتاه مرحله ۱ را وارد کنید.
  4. شما باید لنگر را در همان موقعیتی که نسبت به محیط اطراف در ابتدا قرار داده بودید، ببینید.
  5. برنامه را ببندید و ببندید، و سپس دوباره آن را باز کنید.
  6. مراحل (3) و (4) را تکرار کنید. باید یک لنگر جدید، دوباره در همان موقعیت، ببینید.

وارد کردن کد کوتاه

لنگر با موفقیت حل شد

۵. اشتراک‌گذاری بین دستگاه‌ها

دیدید که چگونه می‌توانید شناسه Cloud Anchor یک لنگر را در حافظه محلی دستگاه خود ذخیره کنید و بعداً آن را برای ایجاد مجدد همان لنگر بازیابی کنید. اما پتانسیل کامل Cloud Anchors تنها زمانی آزاد می‌شود که بتوانید شناسه‌های Cloud Anchor را بین دستگاه‌های مختلف به اشتراک بگذارید.

نحوه اشتراک‌گذاری شناسه‌های Cloud Anchor در برنامه شما به خودتان بستگی دارد. از هر چیزی می‌توان برای انتقال رشته از یک دستگاه به دستگاه دیگر استفاده کرد. برای این آزمایشگاه کد، از پایگاه داده بلادرنگ Firebase برای انتقال شناسه‌های Cloud Anchor بین نمونه‌های برنامه استفاده خواهید کرد.

راه اندازی فایربیس

برای استفاده از این برنامه، باید یک پایگاه داده Firebase Realtime را با حساب گوگل خود راه‌اندازی کنید. این کار با دستیار Firebase در اندروید استودیو آسان است.

در اندروید استودیو، روی Tools > Firebase کلیک کنید. در پنجره Assistant که ظاهر می‌شود، روی Realtime Database کلیک کنید، سپس روی Save and retrieve data کلیک کنید:

68e927cbf324a3b2.png

برای اتصال پروژه اندروید استودیو خود به یک پروژه جدید یا موجود در فایربیس، روی دکمه Connect to Firebase کلیک کنید.

63f3b1ffd6bd263e.png

این از شما می‌خواهد که یک ماژول انتخاب کنید. ماژول work را انتخاب کنید:

be737c689ad6dd78.png

پنجره‌ی «شروع اتصال» نمایش داده می‌شود. این ممکن است کمی طول بکشد.

b48626f8672551ee.png

با حساب گوگل خود وارد شوید و مراحل ایجاد یک پروژه Firebase برای برنامه خود را از طریق وب دنبال کنید تا زمانی که به اندروید استودیو برگردید.

سپس، در پنل Assistant، روی افزودن پایگاه داده Realtime به برنامه خود کلیک کنید:

68e0843fa2531c4c.png

در پنجره‌ای که باز می‌شود، از منوی کشویی ماژول Target ، گزینه work را انتخاب کنید، سپس روی Accept Changes کلیک کنید.

155fd89533c02671.png

این باعث می‌شود:

  1. یک فایل google-services.json به دایرکتوری work خود اضافه کنید
  2. چند خط به فایل build.gradle خود در همان دایرکتوری اضافه کنید.
  3. برنامه را بسازید و اجرا کنید (و ممکن است خطایی در مورد شماره نسخه پایگاه داده Firebase مشاهده کنید).

در فایل build.gradle ماژول work ، خط زیر را پیدا کرده و حذف کنید ( xxxx یک جای‌نگهدار برای شماره آخرین نسخه است)

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

در مرحله بعد، دستورالعمل‌های لینک‌شده از صفحه «تنظیم قوانین برای دسترسی عمومی» را مرور کنید (اما هنوز دنبال نکنید) تا پایگاه داده Firebase Realtime خود را طوری پیکربندی کنید که قابل نوشتن برای همه باشد. این به ساده‌سازی آزمایش در این آزمایشگاه کد کمک می‌کند:

666ebefd39019c05.png

از کنسول Firebase ، پروژه‌ای را که پروژه اندروید استودیو خود را به آن متصل کرده‌اید، انتخاب کنید، سپس BUILD > Realtime Database را انتخاب کنید.

موقعیت مکانی پایگاه داده بلادرنگ فایربیس

برای پیکربندی و راه‌اندازی پایگاه داده Realtime ، روی ایجاد پایگاه داده کلیک کنید:

ایجاد پایگاه داده

هر مکان پایگاه داده را انتخاب کنید.

در مرحله بعد، قوانین امنیتی حالت آزمایشی را انتخاب کرده و روی فعال کردن کلیک کنید:

امنیت پایگاه داده

اکنون برنامه شما برای استفاده از پایگاه داده Firebase پیکربندی شده است.

استفاده از FirebaseManager

اکنون StorageManager با FirebaseManager جایگزین خواهید کرد.

در اندروید استودیو، کلاس CloudAnchorFragment را در زیر دایرکتوری work پیدا کنید. StorageManager با FirebaseManager جایگزین کنید:

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

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

مقداردهی اولیه firebaseManager در متد 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);
}

متد onShortCodeEntered را به صورت زیر تغییر دهید:

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));
  });
}

سپس، متد onHostComplete را به صورت زیر تغییر دهید:

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());
  }
}

برنامه خود را بسازید و اجرا کنید . باید همان جریان رابط کاربری بخش قبل را ببینید، با این تفاوت که اکنون، از پایگاه داده آنلاین Firebase برای ذخیره شناسه‌های Cloud Anchor و کدهای کوتاه به جای حافظه داخلی دستگاه استفاده می‌شود.

تست چند کاربره

برای آزمایش یک تجربه چند کاربره، از دو تلفن مختلف استفاده کنید:

  1. برنامه را روی دو دستگاه نصب کنید.
  2. از یک دستگاه برای میزبانی یک انکر و تولید یک کد کوتاه استفاده کنید.
  3. از دستگاه دیگر برای حل مشکل با استفاده از آن کد کوتاه استفاده کنید.

شما باید بتوانید از یک دستگاه، میزبان انکرها باشید، یک کد کوتاه دریافت کنید و از کد کوتاه در دستگاه دیگر برای دیدن انکر در همان مکان استفاده کنید!

۶. جمع‌بندی

تبریک می‌گویم! به پایان این آزمایشگاه کدنویسی رسیدید!

آنچه ما پوشش داده‌ایم

  • نحوه میزبانی Anchors با استفاده از ARCore SDK و دریافت شناسه Cloud Anchor.
  • نحوه استفاده از شناسه‌های لنگر ابری برای حل لنگرها.
  • نحوه ذخیره و اشتراک‌گذاری شناسه‌های Cloud Anchor بین جلسات مختلف واقعیت افزوده در همان دستگاه یا در دستگاه‌های مختلف.

بیشتر بدانید