1. نظرة عامة
ARCore هي منصة لإنشاء تطبيقات الواقع المعزّز على الأجهزة الجوّالة. تتيح لك Cloud Anchors API إنشاء تطبيقات واقع معزّز تشارك إطارًا مرجعيًا مشتركًا، ما يتيح لعدة مستخدمين وضع محتوى افتراضي في الموقع الجغرافي نفسه في العالم الحقيقي.
يرشدك هذا الدرس التطبيقي حول الترميز إلى استخدام Cloud Anchors API. ستستخدم تطبيق ARCore حاليًا، وتعدّله لاستخدام "المرتكزات السحابية"، وتنشئ تجربة واقع معزّز مشترَكة.
نقاط الارتكاز في ARCore ونقاط الارتكاز الثابتة في السحابة الإلكترونية
من المفاهيم الأساسية في ARCore مفهوم نقطة الارتكاز، وهو يصف موضعًا ثابتًا في العالم الحقيقي. يعدّل ARCore تلقائيًا قيمة وضع Anchor مع تحسُّن عملية تتبُّع الحركة بمرور الوقت.
Cloud Anchors هي عناصر مستضافة في السحابة الإلكترونية. ويمكن حلّها من قِبل عدة مستخدمين لإنشاء إطار مرجعي مشترك بين المستخدمين وأجهزتهم.
استضافة برنامج Anchor
عند استضافة مرساة، يحدث ما يلي:
- يتم تحميل وضع Anchor بالنسبة إلى العالم إلى السحابة الإلكترونية، ويتم الحصول على معرّف Cloud Anchor.
معرّف Cloud Anchor هو سلسلة يجب إرسالها إلى أي شخص يريد حلّ هذا العنصر. - يتم تحميل مجموعة بيانات تحتوي على بيانات مرئية للعنصر الثابت إلى خوادم Google.
تحتوي مجموعة البيانات هذه على بيانات مرئية رآها الجهاز مؤخرًا. سيؤدي تحريك الجهاز قليلاً لالتقاط المنطقة المحيطة بنقطة الارتكاز من وجهات نظر مختلفة قبل الاستضافة إلى تحسين عملية تحديد الموقع الجغرافي.
نقل معرّفات Cloud Anchor
في هذا الدرس العملي، ستنقل معرّفات Cloud Anchor باستخدام Firebase. يمكنك مشاركة أرقام تعريف Cloud Anchor باستخدام وسائل أخرى.
تحديد علامة ارتساء
يمكنك استخدام Cloud Anchor API لحلّ نقطة ارتكاز باستخدام معرّف نقطة الارتكاز السحابية. سيؤدي ذلك إلى إنشاء نقطة ارتكاز جديدة في الموقع الجغرافي الفعلي نفسه الذي توجد فيه نقطة الارتكاز الأصلية المستضافة. أثناء عملية الربط، يجب أن ينظر الجهاز إلى البيئة المادية نفسها التي تم فيها إنشاء المرساة المستضافة الأصلية.
Persistent Cloud Anchors
قبل الإصدار 1.20، كان يمكن حلّ "المرتكزات السحابية" لمدة 24 ساعة فقط بعد استضافتها. باستخدام واجهة برمجة التطبيقات Persistent Cloud Anchors API، يمكنك إنشاء مرساة سحابية يمكن حلّها لمدة تتراوح بين يوم واحد و365 يومًا بعد إنشائها.
ما ستنشئه
في هذا الدرس التطبيقي حول الترميز، ستعتمد على تطبيق ARCore حالي. وبحلول نهاية الدرس، سيتمكّن تطبيقك من تنفيذ ما يلي:
- القدرة على استضافة Cloud Anchors ثابتة والحصول على معرّفات Cloud Anchor
- حفظ معرّفات Cloud Anchor على الجهاز لتسهيل استرجاعها باستخدام
SharedPreferencesعلى Android - استخدِم معرّفات Cloud Anchor المحفوظة لتحديد المراسي المستضافة سابقًا. يسهّل ذلك علينا محاكاة تجربة استخدام متعددة على جهاز واحد لأغراض هذا الدرس التطبيقي حول الترميز.
- مشاركة أرقام تعريف Cloud Anchor مع جهاز آخر يشغّل التطبيق نفسه، لكي يرى عدة مستخدمين تمثال Android في الموضع نفسه
يتم عرض تمثال Android في موضع Cloud Anchor:

أهداف الدورة التعليمية
- كيفية استضافة نقاط الارتكاز باستخدام حزمة تطوير البرامج (SDK) في ARCore والحصول على رقم تعريف Cloud Anchor
- كيفية استخدام أرقام تعريف Cloud Anchor لتحديد موقع نقاط الارتكاز
- كيفية تخزين ومشاركة معرّفات Cloud Anchor بين جلسات الواقع المعزّز المختلفة على الجهاز نفسه أو على أجهزة مختلفة
المتطلبات
- جهاز متوافق مع ARCore، تم توصيله بجهاز التطوير باستخدام كابل USB
- الإصدار 1.22 أو الإصدارات الأحدث من خدمات Google Play للواقع المعزّز
- جهاز تطوير مزوّد باستوديو Android (الإصدار 3.0 أو إصدار أحدث)
2. إعداد بيئة التطوير
إعداد جهاز التطوير
وصِّل جهاز 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
أو نزِّل ملف ZIP واستخرِج ملفاته:
افتح "استوديو Android". انقر على فتح مشروع حالي في "استوديو Android". بعد ذلك، انتقِل إلى الدليل الذي استخرجت منه ملف ZIP الذي تم تنزيله أعلاه، وانقر نقرًا مزدوجًا على الدليل arcore-cloud-anchors.
هذا مشروع Gradle واحد يتضمّن وحدات متعددة. إذا لم تكن لوحة "المشروع" في أعلى يمين "استوديو Android" معروضة في لوحة "المشروع"، انقر على المشاريع من القائمة المنسدلة. يجب أن تظهر النتيجة على النحو التالي:

ستعمل بشكل أساسي في الوحدة work. تتضمّن الوحدات الأخرى وحدة helpers التي تحتوي على مجموعة من فئات التغليف المفيدة التي ستستخدمها. تتوفّر أيضًا حلول كاملة لكل جزء من الدرس العملي. باستثناء الوحدة helpers، تكون كل وحدة تطبيقًا قابلاً للإنشاء.
إذا ظهر لك مربّع حوار يقترح عليك ترقية "المكوّن الإضافي لنظام Gradle المتوافق مع Android"، انقر على عدم تذكيري مرة أخرى بهذا المشروع:

انقر على تشغيل > تشغيل... > ‘work'. في مربّع الحوار اختيار هدف النشر الذي يظهر، يجب أن يكون جهازك مُدرَجًا ضمن الأجهزة المتصلة. اختَر جهازك وانقر على حسنًا. سينشئ استوديو Android التطبيق الأوّلي ويشغّله على جهازك.
عند تشغيل التطبيق للمرة الأولى، سيطلب الإذن CAMERA. انقر على السماح للمتابعة.

كيفية استخدام التطبيق
- حرِّك الجهاز لمساعدة التطبيق في العثور على طائرة. سيظهر المستوى على شكل سطح منقّط عند العثور عليه.
- انقر على مكان ما في الطائرة لوضع نقطة ارتساء. سيتم رسم شكل Android في المكان الذي تم وضع نقطة الارتكاز فيه. يتيح لك هذا التطبيق وضع نقطة ارتساء واحدة فقط في كل مرة.
- حرِّك الجهاز. يجب أن يبدو الشكل وكأنّه ثابت في المكان نفسه حتى عند تحريك الجهاز.
- اضغط على زر CLEAR لإزالة نقطة الارتكاز. سيسمح لك ذلك بوضع نقطة ارتكاز أخرى.

في الوقت الحالي، يستخدم هذا التطبيق ميزة تتبُّع الحركة التي توفّرها ARCore لتتبُّع نقطة ارتساء في عملية تشغيل واحدة للتطبيق. إذا قررت إنهاء التطبيق وإغلاقه وإعادة تشغيله، ستفقد نقطة الارتساء التي تم وضعها سابقًا وأي معلومات ذات صلة بها، بما في ذلك وضعها.
في الأقسام القليلة التالية، ستعمل على تطوير هذا التطبيق لمعرفة كيفية مشاركة نقاط الارتكاز في جلسات الواقع المعزّز.
3- استضافة جلسة Anchor
في هذا القسم، ستعدّل مشروع work لاستضافة نقطة ارتكاز. قبل كتابة الرمز البرمجي، عليك إجراء بعض التعديلات على إعدادات التطبيق.
التعريف بأذونات INTERNET
بما أنّ ميزة "المرتكزات السحابية" تتطلّب التواصل مع خدمة ARCore Cloud Anchor API، يجب أن يحصل تطبيقك على إذن بالوصول إلى الإنترنت.
في ملف 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"/>
تفعيل ARCore API
- انتقِل إلى صفحة خدمة ARCore API.
- في قائمة المشاريع، اختَر مشروعًا أو أنشِئ مشروعًا جديدًا.
- انقر على تفعيل.
إعداد المصادقة بدون مفتاح
لاستخدام ميزة "نقاط الارتكاز السحابية الثابتة"، عليك استخدام ميزة "المصادقة بدون مفتاح" للمصادقة باستخدام ARCore API.
- انتقِل إلى وحدة تحكّم Google Cloud Platform.
- من قائمة المشاريع، اختَر مشروعًا.
- إذا لم تكن صفحة "واجهات برمجة التطبيقات والخدمات" مفتوحة، افتح القائمة الجانبية لوحدة التحكّم واختَر واجهات برمجة التطبيقات والخدمات.
- على يمين الصفحة، انقر على بيانات الاعتماد.
- انقر على إنشاء بيانات اعتماد، ثمّ اختَر معرِّف عميل OAuth.
- املأ القيم التالية:
- نوع التطبيق: Android
- اسم الحزمة:
com.google.ar.core.codelab.cloudanchor
- استرجِع الملف المرجعي لشهادة توقيع تصحيح الأخطاء:
- في مشروعك على "استوديو Android"، افتح لوحة أدوات Gradle.
- في cloud-anchors > work > Tasks > android، شغِّل مهمة signingReport.
- انسخ الملف المرجعي لشهادة 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
حان الوقت لاستضافة نقطة ارتكاز سيتم تحميلها إلى ARCore API.
أضِف الحقل الجديد التالي إلى فئة CloudAnchorFragment:
// Find this line...
private Anchor currentAnchor = null;
// Add these lines right below.
@Nullable
private Future future = null;
تذكَّر إضافة عملية استيراد لـ 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);
شغِّل تطبيقك من "استوديو Android" مرة أخرى. ستظهر لك الرسالة "جارٍ استضافة نقطة ارتكاز..." عند وضع نقطة ارتكاز. من المفترض أن تظهر لك رسالة أخرى عند اكتمال عملية الاستضافة بنجاح. إذا ظهرت لك الرسالة "خطأ في استضافة نقطة الارتكاز: ERROR_NOT_AUTHORIZED"، تأكَّد من إعداد عميل OAuth بشكلٍ سليم.

يمكن لأي شخص يعرف معرّف العنصر الثابت ويتواجد في المكان الفعلي نفسه الذي يتواجد فيه العنصر الثابت استخدام معرّف العنصر الثابت لإنشاء عنصر ثابت في الوضع نفسه تمامًا (الموضع والاتجاه) بالنسبة إلى البيئة المحيطة به.
ومع ذلك، يكون معرّف العنصر المرتبط طويلاً، ولا يمكن لمستخدم آخر إدخاله يدويًا بسهولة. في الأقسام التالية، ستخزّن معرّفات Cloud Anchor بطريقة يسهل استرجاعها من أجل السماح بحلّ المرساة على الجهاز نفسه أو جهاز آخر.
4. معرّفات المتاجر وResolve Anchors
في هذا الجزء، ستخصّص رموزًا قصيرة لمعرّفات Cloud Anchor الطويلة لتسهيل إدخالها يدويًا من قِبل مستخدم آخر. ستستخدِم واجهة برمجة التطبيقات Shared Preferences لتخزين معرّفات Cloud Anchor كقيم في جدول المفتاح/القيمة. سيظل هذا الجدول متاحًا حتى إذا تم إغلاق التطبيق وإعادة تشغيله.
يتم توفير فئة مساعدة باسم StorageManager لك. هذا برنامج تضمين حول واجهة برمجة التطبيقات SharedPreferences يتضمّن طرقًا لإنشاء رموز قصيرة فريدة جديدة وقراءة/كتابة معرّفات Cloud Anchor.
استخدام StorageManager
عدِّل 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());
}
}
الآن، أنشئ التطبيق وشغِّله من "استوديو Android". من المفترض أن تظهر الرموز القصيرة بدلاً من معرّفات Cloud Anchor الطويلة عند إنشاء نقطة ربط واستضافتها.
مباشرةً بعد وضع نقطة ارتساء | بعد الانتظار لبعض الوقت |
|
|
يُرجى العلم أنّ الرموز القصيرة التي يتم إنشاؤها بواسطة StorageManager يتم دائمًا تعيينها بترتيب تصاعدي.
بعد ذلك، ستضيف بعض عناصر واجهة المستخدم التي ستتيح لك إدخال رموز قصيرة وإعادة إنشاء الروابط الثابتة.
إضافة زر "حلّ"
ستضيف زرًا آخر بجانب الزر CLEAR. سيكون هذا الزر هو زر حلّ المشكلة. سيؤدي النقر على الزر حلّ المشكلة إلى فتح مربّع حوار يطلب من المستخدم إدخال رمز قصير. يُستخدَم الرمز القصير لاسترداد معرّف Cloud Anchor من StorageManager وحلّ نقطة الارتكاز.
لإضافة الزر، عليك تعديل الملف res/layout/cloud_anchor_fragment.xml. في استوديو Android، انقر مرّتين على الملف، ثم انقر على علامة التبويب "نص" في أسفل الصفحة لعرض ملف 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);
}
إنشاء التطبيق وتشغيله من "استوديو Android" من المفترض أن يظهر لك الزر حلّ بجانب الزر محو. من المفترض أن يؤدي النقر على الزر حلّ إلى ظهور مربّع حوار كما هو موضّح أدناه.
أصبح زر حلّ المشكلة ظاهرًا الآن | يؤدي النقر على الزر إلى ظهور مربّع الحوار هذا |
|
|
من المفترض أنّ يؤدي النقر على الطائرة واستضافة نقطة ارتكاز إلى إيقاف الزر حلّ، ولكن من المفترض أنّ يؤدي النقر على الزر محو إلى إعادة تفعيله. هذا السلوك مقصود، وذلك لضمان وجود نقطة ارتساء واحدة فقط في المشهد في كل مرة.
لا يفعل مربّع الحوار "حلّ نقطة الارتكاز" أي شيء، ولكنّك ستغيّر ذلك الآن.
حلّ علامات الارتساء
أضِف الطرق التالية في الفئة 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");
}
أنشئ التطبيق وشغِّله من "استوديو Android"، واتّبِع الخطوات التالية:
- أنشئ نقطة ارتساء على مستوى ما وانتظر إلى أن تتم استضافة نقطة الارتساء.
تذكَّر الرمز المختصر. - اضغط على الزر CLEAR لحذف نقطة الارتكاز.
- انقر على الزر حلّ. أدخِل الرمز القصير من الخطوة 1.
- من المفترض أن يظهر لك عنصر ثابت في الموضع نفسه بالنسبة إلى البيئة الذي وضعته فيه في الأصل.
- أغلِق التطبيق وأنهِهِ، ثم افتحه مرة أخرى.
- كرِّر الخطوتَين (3) و (4). سيظهر لك رابط جديد، مرة أخرى في الموضع نفسه.
إدخال رمز قصير | تم حلّ مشكلة العنصر الثابت بنجاح |
|
|
5- المشاركة بين الأجهزة
لقد رأيت كيف يمكنك تخزين معرّف Cloud Anchor الخاص بنقطة ارتكاز في وحدة التخزين المحلية بجهازك، واسترداده لاحقًا لإعادة إنشاء نقطة الارتكاز نفسها. ولكن لا يمكن الاستفادة من الإمكانات الكاملة لـ "المرتكزات السحابية" إلا عند مشاركة معرّفات "المرتكزات السحابية" بين الأجهزة المختلفة.
يعود إليك تحديد طريقة مشاركة أرقام تعريف Cloud Anchor. يمكن استخدام أي وسيلة لنقل السلسلة من جهاز إلى آخر. في هذا الدرس التطبيقي حول الترميز، ستستخدم قاعدة بيانات Firebase في الوقت الفعلي لنقل أرقام تعريف Cloud Anchor بين مثيلات التطبيق.
إعداد Firebase
يجب إعداد قاعدة بيانات Firebase في الوقت الفعلي باستخدام حساب Google لاستخدامها مع هذا التطبيق. ويمكنك إجراء ذلك بسهولة باستخدام "مساعِد Firebase" في استوديو Android.
في "استوديو Android"، انقر على الأدوات > Firebase. في لوحة "المساعد" التي تظهر، انقر على قاعدة بيانات الوقت الفعلي، ثم انقر على حفظ البيانات واسترجاعها:

انقر على الزر الربط بخدمة Firebase لربط مشروعك في استوديو Android بمشروع جديد أو حالي في مشروع Firebase.

سيُطلب منك اختيار وحدة. اختَر الوحدة work:

يظهر مربّع الحوار "بدء الاتصال". قد تستغرق هذه العملية بعض الوقت.

سجِّل الدخول باستخدام حسابك على Google، واتّبِع خطوات سير العمل على الويب لإنشاء مشروع Firebase لتطبيقك إلى أن تعود إلى استوديو Android.
بعد ذلك، في لوحة "المساعد"، انقر على إضافة قاعدة بيانات الوقت الفعلي إلى تطبيقك:

في مربّع الحوار الذي يظهر، اختَر العمل من القائمة المنسدلة الوحدة المستهدَفة، ثمّ انقر على قبول التغييرات.

سيؤدي هذا الإجراء إلى:
- إضافة ملف
google-services.jsonإلى دليلwork - أضِف سطرَين إلى ملف
build.gradleفي الدليل نفسه. - أنشئ التطبيق وشغِّله (وقد يظهر لك خطأ في الحلّ بشأن رقم إصدار قاعدة بيانات Firebase).
في ملف work الوحدة build.gradle، ابحث عن السطر التالي وأزِله (xxxx هو عنصر نائب لرقم أحدث إصدار)
dependencies {
...
implementation 'com.google.firebase:firebase-database:xxxx'
بعد ذلك، راجِع التعليمات المرتبطة من صفحة إعداد قواعدك للسماح بالوصول العام (ولكن لا تتّبعها بعد) لإعداد قاعدة بيانات Firebase في الوقت الفعلي لتكون قابلة للكتابة من أي مكان في العالم. يساعد ذلك في تبسيط الاختبار في هذا الدرس العملي:

من وحدة تحكّم Firebase، اختَر المشروع الذي ربطت به مشروعك على "استوديو Android"، ثم اختَر إنشاء > قاعدة بيانات الوقت الفعلي.

انقر على إنشاء قاعدة بيانات لضبط قاعدة بيانات الوقت الفعلي وإعدادها:

اختَر أي موقع جغرافي لقاعدة البيانات.
في الخطوة التالية، اختَر قواعد الأمان في وضع الاختبار وانقر على تفعيل:

تم الآن ضبط تطبيقك لاستخدام قاعدة بيانات Firebase.
استخدام FirebaseManager
عليك الآن استبدال StorageManager بـ FirebaseManager.
في "استوديو Android"، ابحث عن الفئة 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 والرموز القصيرة بدلاً من التخزين المحلي على الجهاز.
اختبارات تعدد المستخدمين
لاختبار تجربة استخدام متعددة المستخدمين، استخدِم هاتفَين مختلفَين:
- ثبِّت التطبيق على جهازَين.
- استخدِم جهازًا واحدًا لاستضافة نقطة ارتكاز وإنشاء رمز قصير.
- استخدِم الجهاز الآخر لحلّ المرساة باستخدام هذا الرمز القصير.
من المفترض أن تتمكّن من استضافة نقاط الارتكاز من جهاز واحد والحصول على رمز قصير واستخدام الرمز القصير على الجهاز الآخر لرؤية نقطة الارتكاز في المكان نفسه.
6. الخاتمة
تهانينا! لقد وصلت إلى نهاية هذا الدرس العملي.
المواضيع التي تناولناها
- كيفية استضافة نقاط الارتكاز باستخدام حزمة تطوير البرامج (SDK) في ARCore والحصول على رقم تعريف Cloud Anchor
- كيفية استخدام أرقام تعريف Cloud Anchor لتحديد موقع نقاط الارتكاز
- كيفية تخزين ومشاركة معرّفات Cloud Anchor بين جلسات الواقع المعزّز المختلفة على الجهاز نفسه أو على أجهزة مختلفة





