ক্রমাগত ক্লাউড অ্যাঙ্কর সহ ARCore ক্লাউড অ্যাঙ্কর

1. সংক্ষিপ্ত বিবরণ

ARCore হল মোবাইল ডিভাইসে অগমেন্টেড রিয়েলিটি অ্যাপ তৈরির একটি প্ল্যাটফর্ম। ক্লাউড অ্যাঙ্করস API আপনাকে এমন AR অ্যাপ তৈরি করার ক্ষমতা দেয় যা একটি সাধারণ ফ্রেম-অফ-রেফারেন্স ভাগ করে, একাধিক ব্যবহারকারীকে একই বাস্তব-জগতের অবস্থানে ভার্চুয়াল সামগ্রী স্থাপন করতে সক্ষম করে।

এই কোডল্যাব আপনাকে ক্লাউড অ্যাঙ্করস API-এর মাধ্যমে গাইড করবে। আপনি একটি বিদ্যমান ARCore অ্যাপ ব্যবহার করবেন, ক্লাউড অ্যাঙ্কর ব্যবহার করার জন্য এটি পরিবর্তন করবেন এবং একটি ভাগ করা AR অভিজ্ঞতা তৈরি করবেন।

ARCore অ্যাঙ্কর এবং স্থায়ী ক্লাউড অ্যাঙ্কর

ARCore-এর একটি মৌলিক ধারণা হল Anchor , যা বাস্তব জগতে একটি স্থির অবস্থান বর্ণনা করে। সময়ের সাথে সাথে গতি ট্র্যাকিং উন্নত হওয়ার সাথে সাথে ARCore স্বয়ংক্রিয়ভাবে একটি Anchor-এর ভঙ্গির মান সামঞ্জস্য করে।

ক্লাউড অ্যাঙ্কর হলো ক্লাউডে হোস্ট করা অ্যাঙ্কর। ব্যবহারকারী এবং তাদের ডিভাইসের মধ্যে একটি সাধারণ রেফারেন্স ফ্রেম স্থাপনের জন্য একাধিক ব্যবহারকারী এগুলি সমাধান করতে পারেন।

অ্যাঙ্কর হোস্টিং

যখন একটি অ্যাঙ্কর হোস্ট করা হয়, তখন নিম্নলিখিত জিনিসগুলি ঘটে:

  1. বিশ্বের সাপেক্ষে অ্যাঙ্করের ভঙ্গি ক্লাউডে আপলোড করা হয় এবং একটি ক্লাউড অ্যাঙ্কর আইডি পাওয়া যায়।
    ক্লাউড অ্যাঙ্কর আইডি হল একটি স্ট্রিং যা এই অ্যাঙ্করটি সমাধান করতে চাইলে যে কাউকে পাঠাতে হবে।
  2. অ্যাঙ্করের জন্য ভিজ্যুয়াল ডেটা সম্বলিত একটি ডেটাসেট Google সার্ভারে আপলোড করা হয়।
    এই ডেটাসেটে ডিভাইসটি সম্প্রতি দেখেছে এমন ভিজ্যুয়াল ডেটা রয়েছে। হোস্টিংয়ের আগে বিভিন্ন দৃষ্টিকোণ থেকে অ্যাঙ্করের চারপাশের এলাকা ক্যাপচার করার জন্য ডিভাইসটিকে কিছুটা ঘোরালে আরও ভালো স্থানীয়করণ হবে।

ক্লাউড অ্যাঙ্কর আইডি ট্রান্সফার করা হচ্ছে

এই কোডল্যাবে, আপনি Firebase ব্যবহার করে ক্লাউড অ্যাঙ্কর আইডি স্থানান্তর করবেন। আপনি অন্যান্য উপায়ে ক্লাউড অ্যাঙ্কর আইডি শেয়ার করতে পারবেন।

একটি অ্যাঙ্কর সমাধান করা

আপনি ক্লাউড অ্যাঙ্কর এপিআই ব্যবহার করে কোনও অ্যাঙ্কর সমাধান করতে পারেন তার ক্লাউড অ্যাঙ্কর আইডি ব্যবহার করে। এটি মূল হোস্ট করা অ্যাঙ্করের মতো একই ভৌত অবস্থানে একটি নতুন অ্যাঙ্কর তৈরি করে। সমাধান করার সময়, ডিভাইসটিকে মূল হোস্ট করা অ্যাঙ্করের মতো একই ভৌত পরিবেশের দিকে নজর দিতে হবে।

স্থায়ী ক্লাউড অ্যাঙ্কর

১.২০ এর আগে, ক্লাউড অ্যাঙ্করগুলি হোস্ট করার পর কেবল ২৪ ঘন্টার জন্য সমাধান করা যেত। পারসিসটেন্ট ক্লাউড অ্যাঙ্কর API এর সাহায্যে, আপনি একটি ক্লাউড অ্যাঙ্কর তৈরি করতে পারেন যা তৈরির পর ১ দিন থেকে ৩৬৫ দিনের মধ্যে সমাধান করা যেতে পারে।

তুমি কী তৈরি করবে

এই কোডল্যাবে, আপনি একটি পূর্ব-বিদ্যমান ARCore অ্যাপ তৈরি করতে যাচ্ছেন। কোডল্যাবের শেষে, আপনার অ্যাপটি:

  • স্থায়ী ক্লাউড অ্যাঙ্কর হোস্ট করতে এবং ক্লাউড অ্যাঙ্কর আইডি পেতে সক্ষম হোন।
  • Android SharedPreferences ব্যবহার করে সহজে পুনরুদ্ধারের জন্য ডিভাইসে ক্লাউড অ্যাঙ্কর আইডি সংরক্ষণ করুন।
  • পূর্বে হোস্ট করা অ্যাঙ্করগুলি সমাধান করতে সংরক্ষিত ক্লাউড অ্যাঙ্কর আইডি ব্যবহার করুন। এর ফলে এই কোডল্যাবের উদ্দেশ্যে একটি ডিভাইসের মাধ্যমে একাধিক ব্যবহারকারীর অভিজ্ঞতা সিমুলেট করা আমাদের পক্ষে সহজ হয়।
  • একই অ্যাপ চালিত অন্য ডিভাইসের সাথে ক্লাউড অ্যাঙ্কর আইডি শেয়ার করুন, যাতে একাধিক ব্যবহারকারী একই অবস্থানে অ্যান্ড্রয়েড স্ট্যাচু দেখতে পান।

ক্লাউড অ্যাঙ্করের অবস্থানে একটি অ্যান্ড্রয়েড মূর্তি তৈরি করা হয়েছে:

তুমি কি শিখবে

  • ARCore SDK ব্যবহার করে অ্যাঙ্কর হোস্ট করার পদ্ধতি এবং একটি ক্লাউড অ্যাঙ্কর আইডি পাওয়ার পদ্ধতি।
  • অ্যাঙ্কর সমাধানের জন্য ক্লাউড অ্যাঙ্কর আইডি কীভাবে ব্যবহার করবেন।
  • একই ডিভাইসে বা বিভিন্ন ডিভাইসে বিভিন্ন AR সেশনের মধ্যে ক্লাউড অ্যাঙ্কর আইডি কীভাবে সংরক্ষণ এবং ভাগ করবেন।

তোমার যা লাগবে

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 ফাইল ডাউনলোড করুন এবং এটি এক্সট্র্যাক্ট করুন:

অ্যান্ড্রয়েড স্টুডিও চালু করুন। একটি বিদ্যমান অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট খুলুন ক্লিক করুন। তারপর, উপরে ডাউনলোড করা জিপ ফাইলটি যে ডিরেক্টরিতে আপনি এক্সট্র্যাক্ট করেছেন সেখানে যান এবং arcore-cloud-anchors ডিরেক্টরিতে ডাবল-ক্লিক করুন।

এটি একটি একক গ্রেডল প্রকল্প যার একাধিক মডিউল রয়েছে। যদি অ্যান্ড্রয়েড স্টুডিওর উপরের বাম দিকের প্রজেক্ট প্যানটি ইতিমধ্যেই প্রজেক্ট প্যানে প্রদর্শিত না হয়, তাহলে ড্রপ-ডাউন মেনু থেকে প্রজেক্টগুলিতে ক্লিক করুন। ফলাফলটি এরকম হওয়া উচিত:

52282f0415fdbdcb.png সম্পর্কে

তুমি মূলত work মডিউলে কাজ করবে। অন্যান্য মডিউলগুলির মধ্যে একটি helpers মডিউল রয়েছে যার মধ্যে রয়েছে দরকারী র‍্যাপার ক্লাসের একটি সেট যা তুমি ব্যবহার করবে। কোডল্যাবের প্রতিটি অংশের জন্য সম্পূর্ণ সমাধানও রয়েছে। helpers মডিউল ছাড়া, প্রতিটি মডিউল একটি তৈরিযোগ্য অ্যাপ।

যদি আপনি একটি ডায়ালগ দেখতে পান যেখানে আপনাকে Android Gradle Plugin আপগ্রেড করার পরামর্শ দেওয়া হয়, তাহলে Don't remind me again for this project এ ক্লিক করুন:

31a93c7e9cc58b53.png সম্পর্কে

Run > Run... > 'work' এ ক্লিক করুন। Select Deployment Target ডায়ালগে প্রদর্শিত হবে, আপনার ডিভাইসটি Connected Devices এর অধীনে তালিকাভুক্ত হওয়া উচিত। আপনার ডিভাইসটি নির্বাচন করুন এবং OK এ ক্লিক করুন। Android Studio প্রাথমিক অ্যাপটি তৈরি করবে এবং আপনার ডিভাইসে এটি চালাবে।

যখন আপনি প্রথমবার অ্যাপটি চালাবেন, তখন এটি CAMERA অনুমতি চাইবে। চালিয়ে যেতে অনুমতি দিন ট্যাপ করুন।

f7ea81f71a4b969e.png সম্পর্কে

অ্যাপটি কীভাবে ব্যবহার করবেন

  1. অ্যাপটিকে একটি বিমান খুঁজে পেতে সাহায্য করার জন্য ডিভাইসটি ঘোরান । যখন একটি বিমান পাওয়া যাবে তখন এটি একটি বিন্দুযুক্ত পৃষ্ঠ হিসাবে দেখানো হবে।
  2. নোঙর স্থাপন করতে বিমানের কোথাও ট্যাপ করুন । নোঙরটি যেখানে স্থাপন করা হয়েছিল সেখানে একটি অ্যান্ড্রয়েড চিত্র আঁকা হবে। এই অ্যাপটি আপনাকে একবারে কেবল একটি নোঙর স্থাপন করতে দেয়।
  3. ডিভাইসটি ঘোরান । ডিভাইসটি ঘোরার সময়ও চিত্রটি একই স্থানে থাকা উচিত।
  4. নোঙ্গরটি সরাতে CLEAR বোতাম টিপুন । এটি আপনাকে আরেকটি নোঙ্গর স্থাপন করার অনুমতি দেবে।

এই মুহূর্তে, এই অ্যাপটি শুধুমাত্র ARCore দ্বারা প্রদত্ত মোশন ট্র্যাকিং ব্যবহার করে অ্যাপটি একবার চালানোর সময় একটি অ্যাঙ্কর ট্র্যাক করছে। আপনি যদি অ্যাপটি বন্ধ করার, বন্ধ করার এবং পুনরায় চালু করার সিদ্ধান্ত নেন, তাহলে পূর্বে স্থাপন করা অ্যাঙ্কর এবং এর সাথে সম্পর্কিত যেকোনো তথ্য, যার মধ্যে এর ভঙ্গিও রয়েছে, হারিয়ে যাবে।

পরবর্তী কয়েকটি বিভাগে, আপনি এই অ্যাপটি তৈরি করবেন এবং দেখবেন কিভাবে AR সেশন জুড়ে অ্যাঙ্কর শেয়ার করা যায়।

৩. একটি নোঙ্গর হোস্ট করুন

এই বিভাগে আপনি অ্যাঙ্কর হোস্ট করার জন্য work প্রকল্পটি পরিবর্তন করবেন। কোড লেখার আগে, আপনাকে অ্যাপের কনফিগারেশনে কিছু পরিবর্তন বাস্তবায়ন করতে হবে।

ইন্টারনেট অনুমতি ঘোষণা করুন

যেহেতু ক্লাউড অ্যাঙ্করগুলির জন্য ARCore ক্লাউড অ্যাঙ্কর 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 সক্ষম করুন

  1. ARCore API পরিষেবা পৃষ্ঠায় যান।
  2. প্রকল্পের তালিকায়, একটি প্রকল্প নির্বাচন করুন অথবা একটি নতুন প্রকল্প তৈরি করুন।
  3. সক্রিয় করুন ক্লিক করুন।

চাবিহীন প্রমাণীকরণ সেট আপ করুন

পারসিসটেন্ট ক্লাউড অ্যাঙ্কর ব্যবহার করার জন্য, আপনাকে ARCore API দিয়ে প্রমাণীকরণের জন্য কীলেস প্রমাণীকরণ ব্যবহার করতে হবে।

  1. গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে যান।
  2. প্রকল্প তালিকা থেকে, একটি প্রকল্প নির্বাচন করুন।
  3. যদি APIs & services পৃষ্ঠাটি ইতিমধ্যে খোলা না থাকে, তাহলে কনসোলের বাম দিকের মেনুটি খুলুন এবং APIs & services নির্বাচন করুন।
  4. বাম দিকে, শংসাপত্রগুলিতে ক্লিক করুন।
  5. Create Credentials এ ক্লিক করুন, তারপর OAuth ক্লায়েন্ট আইডি নির্বাচন করুন।
  6. নিম্নলিখিত মানগুলি পূরণ করুন:
    • আবেদনের ধরণ : অ্যান্ড্রয়েড
    • প্যাকেজের নাম : com.google.ar.core.codelab.cloudanchor
  7. আপনার ডিবাগ স্বাক্ষরকারী শংসাপত্রের আঙ্গুলের ছাপ পুনরুদ্ধার করুন:
    1. আপনার অ্যান্ড্রয়েড স্টুডিও প্রজেক্টে, Gradle টুলপেন খুলুন।
    2. cloud-anchors > work > Tasks > android এ, signingReport টাস্কটি চালান।
    3. গুগল ক্লাউডের SHA- 1 সার্টিফিকেট ফিঙ্গারপ্রিন্ট ফিল্ডে SHA-1 ফিঙ্গারপ্রিন্ট কপি করুন।

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 মডিউলটি তৈরি করতে ভুলবেন না। আপনার অ্যাপটি সফলভাবে তৈরি হওয়া উচিত এবং আগের মতোই চলতে হবে।

একটি অ্যাঙ্কর হোস্ট করুন

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

CloudAnchorFragment ক্লাসে handleTap পদ্ধতিটি খুঁজুন এবং এই লাইনগুলি যোগ করুন:

// 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 ক্লায়েন্ট সঠিকভাবে কনফিগার করা আছে।

যে কেউ অ্যাঙ্কর আইডি জানেন এবং অ্যাঙ্করের মতো একই ভৌত স্থানে উপস্থিত থাকেন, তিনি অ্যাঙ্কর আইডি ব্যবহার করে তাদের চারপাশের পরিবেশের সাপেক্ষে ঠিক একই ভঙ্গিতে (অবস্থান এবং অভিযোজন) একটি অ্যাঙ্কর তৈরি করতে পারেন।

তবে, অ্যাঙ্কর আইডিটি দীর্ঘ, এবং অন্য ব্যবহারকারীর পক্ষে ম্যানুয়ালি প্রবেশ করা সহজ নয়। নিম্নলিখিত বিভাগগুলিতে, আপনি ক্লাউড অ্যাঙ্কর আইডিগুলি এমনভাবে সংরক্ষণ করবেন যাতে একই বা অন্য ডিভাইসে অ্যাঙ্কর সমাধানের অনুমতি দেওয়া যায়।

৪. স্টোর আইডি এবং রিসলভ অ্যাঙ্কর

এই অংশে, আপনি লম্বা ক্লাউড অ্যাঙ্কর আইডিগুলিতে ছোট কোড বরাদ্দ করবেন যাতে অন্য ব্যবহারকারী ম্যানুয়ালি প্রবেশ করতে পারেন। আপনি ক্লাউড অ্যাঙ্কর আইডিগুলিকে একটি কী-মান টেবিলে মান হিসাবে সংরক্ষণ করতে শেয়ার্ড প্রেফারেন্সেস API ব্যবহার করবেন। অ্যাপটি বন্ধ করে পুনরায় চালু করা হলেও এই টেবিলটি টিকে থাকবে।

StorageManager নামে একটি সহায়ক ক্লাস ইতিমধ্যেই আপনার জন্য সরবরাহ করা হয়েছে। এটি SharedPreferences API-এর চারপাশে একটি মোড়ক যা নতুন অনন্য শর্ট কোড তৈরি করার এবং ক্লাউড অ্যাঙ্কর আইডি পড়ার/লেখার পদ্ধতি রয়েছে।

স্টোরেজ ম্যানেজার ব্যবহার করুন

ক্লাউড অ্যাঙ্কর আইডিগুলিকে শর্ট কোড সহ সংরক্ষণ করার জন্য StorageManager ব্যবহার করতে CloudAnchorFragment পরিবর্তন করুন, যাতে সেগুলি সহজেই পুনরুদ্ধার করা যায়।

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

এখন, অ্যান্ড্রয়েড স্টুডিও থেকে অ্যাপটি তৈরি করুন এবং চালান । আপনি যখন একটি অ্যাঙ্কর তৈরি এবং হোস্ট করবেন তখন লম্বা ক্লাউড অ্যাঙ্কর আইডির পরিবর্তে শর্ট কোডগুলি প্রদর্শিত হবে।

নোঙর স্থাপনের পরপরই

কিছুক্ষণ অপেক্ষা করার পর

মনে রাখবেন যে StorageManager দ্বারা তৈরি শর্ট কোডগুলি বর্তমানে সর্বদা ক্রমবর্ধমান ক্রমে বরাদ্দ করা হয়।

এরপর, আপনি কয়েকটি UI উপাদান যোগ করবেন যা আপনাকে শর্ট কোড লিখতে এবং অ্যাঙ্করগুলি পুনরায় তৈরি করতে দেবে।

সমাধান বোতামটি যোগ করুন

আপনি CLEAR বোতামের পাশে আরেকটি বোতাম যুক্ত করবেন। এটি হবে RESOLVE বোতাম। RESOLVE বোতামে ক্লিক করলে একটি ডায়ালগ বক্স খুলবে যা ব্যবহারকারীকে একটি শর্ট কোডের জন্য অনুরোধ করবে। শর্ট কোডটি StorageManager থেকে ক্লাউড অ্যাঙ্কর আইডি পুনরুদ্ধার করতে এবং অ্যাঙ্করটি সমাধান করতে ব্যবহৃত হয়।

বোতামটি যোগ করার জন্য, আপনাকে res/layout/cloud_anchor_fragment.xml ফাইলটি পরিবর্তন করতে হবে। অ্যান্ড্রয়েড স্টুডিওতে, ফাইলটিতে ডাবল-ক্লিক করুন, তারপর raw 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");
}

onCreateView পদ্ধতিতে resolveButton নিম্নলিখিতভাবে শুরু করুন:

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

অ্যান্ড্রয়েড স্টুডিও থেকে অ্যাপটি তৈরি করুন এবং চালান । আপনি CLEAR বোতামের পাশে RESOLVE বোতামটি দেখতে পাবেন। RESOLVE বোতামটি ক্লিক করলে নীচের চিত্রের মতো একটি ডায়ালগ পপ আপ হবে।

RESOLVE বোতামটি এখন দৃশ্যমান।

বোতামটি ক্লিক করলে এই ডায়ালগটি প্রদর্শিত হবে।

প্লেনে ট্যাপ করে অ্যাঙ্কর হোস্ট করলে RESOLVE বোতামটি নিষ্ক্রিয় হয়ে যাবে, কিন্তু CLEAR বোতামটি ট্যাপ করলে এটি আবার সক্রিয় হবে। এটি ডিজাইন অনুসারে, যাতে একবারে দৃশ্যে কেবল একটি অ্যাঙ্কর থাকে।

"Resolve Anchor" ডায়ালগ কিছুই করে না, কিন্তু আপনি এখন এটি পরিবর্তন করবেন।

অ্যাঙ্কর সমাধান করুন

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) পুনরাবৃত্তি করুন। আপনি আবার একই অবস্থানে একটি নতুন অ্যাঙ্কর দেখতে পাবেন।

একটি সংক্ষিপ্ত কোড প্রবেশ করানো হচ্ছে

অ্যাঙ্কর সফলভাবে সমাধান করা হয়েছে

৫. ডিভাইসের মধ্যে শেয়ার করুন

আপনি দেখেছেন কিভাবে আপনি একটি অ্যাঙ্করের ক্লাউড অ্যাঙ্কর আইডি আপনার ডিভাইসের স্থানীয় স্টোরেজে সংরক্ষণ করতে পারেন এবং পরে একই অ্যাঙ্করটি পুনরায় তৈরি করতে এটি পুনরুদ্ধার করতে পারেন। কিন্তু ক্লাউড অ্যাঙ্করগুলির সম্পূর্ণ সম্ভাবনা তখনই উন্মোচিত হয় যখন আপনি বিভিন্ন ডিভাইসের মধ্যে ক্লাউড অ্যাঙ্কর আইডি শেয়ার করতে পারেন।

আপনার অ্যাপ কীভাবে ক্লাউড অ্যাঙ্কর আইডি শেয়ার করবে তা আপনার উপর নির্ভর করে। এক ডিভাইস থেকে অন্য ডিভাইসে স্ট্রিং ট্রান্সফার করার জন্য যেকোনো কিছু ব্যবহার করা যেতে পারে। এই কোডল্যাবের জন্য, আপনি অ্যাপের বিভিন্ন ইনস্ট্যান্সের মধ্যে ক্লাউড অ্যাঙ্কর আইডি ট্রান্সফার করার জন্য ফায়ারবেস রিয়েলটাইম ডেটাবেস ব্যবহার করবেন।

ফায়ারবেস সেট আপ করা হচ্ছে

এই অ্যাপটি ব্যবহার করার জন্য আপনার গুগল অ্যাকাউন্টের সাথে একটি ফায়ারবেস রিয়েলটাইম ডেটাবেস সেট আপ করতে হবে। অ্যান্ড্রয়েড স্টুডিওতে ফায়ারবেস অ্যাসিস্ট্যান্টের সাহায্যে এটি করা সহজ।

অ্যান্ড্রয়েড স্টুডিওতে, Tools > Firebase এ ক্লিক করুন। যে Assistant প্যানে পপ আপ হবে, সেখানে Realtime Database এ ক্লিক করুন, তারপর Save and retrieve data এ ক্লিক করুন:

68e927cbf324a3b2.png সম্পর্কে

আপনার অ্যান্ড্রয়েড স্টুডিও প্রকল্পটিকে একটি নতুন বা বিদ্যমান ফায়ারবেস প্রকল্পের সাথে সংযুক্ত করতে "ফায়ারবেস সংযোগ করুন" বোতামে ক্লিক করুন।

63f3b1ffd6bd263e.png সম্পর্কে

এটি আপনাকে একটি মডিউল নির্বাচন করতে বলবে। work মডিউল নির্বাচন করুন:

be737c689ad6dd78.png সম্পর্কে

"Starting Connect" ডায়ালগটি প্রদর্শিত হবে। এতে কিছুটা সময় লাগতে পারে।

b48626f8672551ee.png সম্পর্কে

আপনার গুগল অ্যাকাউন্ট দিয়ে সাইন ইন করুন এবং অ্যান্ড্রয়েড স্টুডিওতে ফিরে না আসা পর্যন্ত আপনার অ্যাপের জন্য একটি ফায়ারবেস প্রকল্প তৈরি করার জন্য ওয়েব ওয়ার্কফ্লোটি দেখুন।

এরপর, Assistant প্যানে, আপনার অ্যাপে রিয়েলটাইম ডেটাবেস যোগ করুন এ ক্লিক করুন:

68e0843fa2531c4c.png সম্পর্কে

পপ আপ হওয়া ডায়ালগে, টার্গেট মডিউল ড্রপ-ডাউন থেকে কাজ নির্বাচন করুন, তারপর পরিবর্তনগুলি গ্রহণ করুন ক্লিক করুন।

155fd89533c02671.png সম্পর্কে

এটি হবে:

  1. আপনার work ডিরেক্টরিতে একটি google-services.json ফাইল যোগ করুন।
  2. একই ডিরেক্টরিতে আপনার build.gradle ফাইলে কয়েকটি লাইন যোগ করুন।
  3. অ্যাপটি তৈরি করুন এবং চালান (এবং আপনি Firebase ডাটাবেস সংস্করণ নম্বর সম্পর্কে একটি সমাধান ত্রুটি দেখতে পারেন)।

work মডিউল build.gradle ফাইলে, নিম্নলিখিত লাইনটি খুঁজুন এবং সরিয়ে ফেলুন ( xxxx হল সর্বশেষ সংস্করণ নম্বরের জন্য একটি স্থানধারক)

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

এরপর, আপনার Firebase Realtime Database কে বিশ্ব-লেখার যোগ্য করে তুলতে configure your rules for public access পৃষ্ঠা থেকে লিঙ্ক করা নির্দেশাবলী পর্যালোচনা করুন (কিন্তু এখনও অনুসরণ করবেন না)। এটি এই কোডল্যাবে পরীক্ষা সহজ করতে সাহায্য করে:

666ebefd39019c05.png সম্পর্কে

Firebase Console থেকে, আপনার Android Studio প্রকল্পটি যে প্রকল্পের সাথে সংযুক্ত করেছেন সেটি নির্বাচন করুন, তারপর BUILD > Realtime Database নির্বাচন করুন।

ফায়ারবেস রিয়েলটাইম ডাটাবেস অবস্থান

রিয়েলটাইম ডাটাবেস কনফিগার এবং সেটআপ করতে Create Database এ ক্লিক করুন:

ডাটাবেস তৈরি করুন

যেকোনো ডাটাবেসের অবস্থান নির্বাচন করুন।

পরবর্তী ধাপে, পরীক্ষা মোড সুরক্ষা নিয়ম নির্বাচন করুন এবং সক্ষম করুন এ ক্লিক করুন:

ডাটাবেস নিরাপত্তা

আপনার অ্যাপটি এখন Firebase ডাটাবেস ব্যবহারের জন্য কনফিগার করা হয়েছে।

FirebaseManager ব্যবহার করা

আপনি এখন StorageManager FirebaseManager দিয়ে প্রতিস্থাপন করবেন।

অ্যান্ড্রয়েড স্টুডিওতে, work ডিরেক্টরির অধীনে CloudAnchorFragment ক্লাসটি খুঁজুন। StorageManager পরিবর্তে FirebaseManager ব্যবহার করুন:

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

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

onAttach পদ্ধতিতে firebaseManager আরম্ভ করুন:

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

আপনার অ্যাপ তৈরি করুন এবং চালান । আপনি আগের বিভাগের মতো একই UI প্রবাহ দেখতে পাবেন, তবে এখন, অনলাইন ফায়ারবেস ডাটাবেস ডিভাইস-স্থানীয় স্টোরেজের পরিবর্তে ক্লাউড অ্যাঙ্কর আইডি এবং শর্ট কোড সংরক্ষণ করতে ব্যবহৃত হচ্ছে।

বহু-ব্যবহারকারী পরীক্ষা

একাধিক ব্যবহারকারীর অভিজ্ঞতা পরীক্ষা করতে, দুটি ভিন্ন ফোন ব্যবহার করুন:

  1. দুটি ডিভাইসে অ্যাপটি ইনস্টল করুন।
  2. একটি অ্যাঙ্কর হোস্ট করতে এবং একটি শর্ট কোড তৈরি করতে একটি ডিভাইস ব্যবহার করুন।
  3. সেই শর্ট কোড ব্যবহার করে অ্যাঙ্করটি সমাধান করতে অন্য ডিভাইসটি ব্যবহার করুন।

আপনি একটি ডিভাইস থেকে অ্যাঙ্কর হোস্ট করতে পারবেন, একটি শর্ট কোড পেতে পারবেন এবং অন্য ডিভাইসের শর্ট কোড ব্যবহার করে একই জায়গায় অ্যাঙ্করটি দেখতে পারবেন!

৬. শেষ করা

অভিনন্দন! আপনি এই কোডল্যাবের শেষে পৌঁছে গেছেন!

আমরা যা কভার করেছি

  • ARCore SDK ব্যবহার করে অ্যাঙ্কর হোস্ট করার পদ্ধতি এবং একটি ক্লাউড অ্যাঙ্কর আইডি পাওয়ার পদ্ধতি।
  • অ্যাঙ্কর সমাধানের জন্য ক্লাউড অ্যাঙ্কর আইডি কীভাবে ব্যবহার করবেন।
  • একই ডিভাইসে বা বিভিন্ন ডিভাইসে বিভিন্ন AR সেশনের মধ্যে ক্লাউড অ্যাঙ্কর আইডি কীভাবে সংরক্ষণ এবং ভাগ করবেন।

আরও জানুন