গুগল অ্যাসিস্ট্যান্টের সাথে অ্যান্ড্রয়েড উইজেট একত্রিত করুন

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

প্রথম অ্যাপ অ্যাকশনস কোডল্যাবে , আপনি শিখেছেন কীভাবে হেলথ অ্যান্ড ফিটনেস বিআইআই ক্যাটাগরি থেকে বিল্ট-ইন ইন্টেন্ট (বিআইআই) প্রয়োগ করে একটি নমুনা ফিটনেস অ্যাপে গুগল অ্যাসিস্ট্যান্টকে সম্প্রসারিত করা যায়।

অ্যাপ অ্যাকশন ব্যবহারকারীদের অ্যাসিস্ট্যান্টকে " হে গুগল, ExampleApp-এ একটি দৌড় শুরু করো"-এর মতো প্রশ্ন করে সরাসরি অ্যাপের নির্দিষ্ট ফিচারগুলো চালু করার সুযোগ দেয়। অ্যাপ চালু করার পাশাপাশি, অ্যাসিস্ট্যান্ট যোগ্য BII-এর অনুরোধ পূরণ করার জন্য ব্যবহারকারীকে একটি ইন্টারেক্টিভ অ্যান্ড্রয়েড উইজেটও দেখাতে পারে।

একটি স্ক্রিন যেখানে দেখা যাচ্ছে, অ্যাপের GET_EXERCISE_OBSERVATION BII ক্যাপাবিলিটি ট্রিগার করা একটি ইউজার কোয়েরির জবাবে অ্যাসিস্ট্যান্ট একটি উইজেট ফেরত দিচ্ছে।

আপনি যা তৈরি করবেন

এই কোডল্যাবে আপনি শিখবেন কীভাবে অ্যাসিস্ট্যান্ট ব্যবহারকারীর অনুরোধ পূরণ করার জন্য অ্যান্ড্রয়েড উইজেট রিটার্ন করতে হয়। এছাড়াও আপনি শিখবেন:

  • উইজেটগুলো ব্যক্তিগতকরণ করতে BII প্যারামিটার ব্যবহার করুন।
  • আপনার উইজেটগুলোর জন্য অ্যাসিস্ট্যান্ট-এ টেক্সট-টু-স্পিচ (TTS) ভূমিকা যোগ করুন।
  • কোন কোন BII উইজেট ফুলফিলমেন্ট সমর্থন করে তা নির্ধারণ করতে বিল্ট-ইন ইনটেন্ট রেফারেন্স ব্যবহার করুন।

পূর্বশর্ত

এগিয়ে যাওয়ার আগে, নিশ্চিত করুন যে আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট অ্যাপ অ্যাকশন ডেভেলপমেন্টের জন্য প্রস্তুত। এতে নিম্নলিখিত বৈশিষ্ট্যগুলো থাকা উচিত:

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

আপনি যদি কোনো ফিজিক্যাল ডিভাইস ব্যবহার করেন, তবে সেটিকে আপনার লোকাল ডেভেলপমেন্ট মেশিনের সাথে সংযুক্ত করুন।

২. এটি কীভাবে কাজ করে তা বুঝুন

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

এই কোডল্যাবে, আপনি এমন একটি ক্যাপাবিলিটি সংজ্ঞায়িত করবেন যা GET_EXERCISE_OBSERVATION BII-এর জন্য সমর্থন রেজিস্টার করে। এই ক্যাপাবিলিটিতে, আপনি অ্যাসিস্ট্যান্টকে এই BII-এর অনুরোধগুলো পূরণ করার জন্য FitActions উইজেট ক্লাসে একটি অ্যান্ড্রয়েড ইন্টেন্ট তৈরি করতে নির্দেশ দেবেন। আপনি এই ক্লাসটি আপডেট করবেন যাতে এটি ব্যবহারকারীকে দেখানোর জন্য অ্যাসিস্ট্যান্টের একটি ব্যক্তিগতকৃত উইজেট এবং ঘোষণা করার জন্য অ্যাসিস্ট্যান্টের একটি TTS ইন্ট্রোডাকশন তৈরি করে।

নিম্নলিখিত চিত্রটি এই প্রবাহটি প্রদর্শন করে:

অ্যাসিস্ট্যান্ট উইজেট পূরণের একটি ফ্লো ডায়াগ্রাম।

FitActions উইজেট

FitActions স্যাম্পল অ্যাপটিতে একটি ওয়ার্কআউট তথ্য উইজেট রয়েছে যা ব্যবহারকারীরা তাদের হোম স্ক্রিনে যোগ করতে পারেন। এই উইজেটটি ব্যবহারকারীর সেইসব কোয়েরি পূরণের জন্য একটি চমৎকার মাধ্যম, যা GET_EXERCISE_OBSERVATION BII-কে ট্রিগার করে।

উইজেটটি কীভাবে কাজ করে

যখন কোনো ব্যবহারকারী হোম স্ক্রিনে একটি উইজেট যোগ করেন, তখন উইজেটটি ডিভাইসের ব্রডকাস্ট রিসিভারকে পিং করে। এই সার্ভিসটি অ্যাপের AndroidManifest.xml রিসোর্সে থাকা উইজেটের রিসিভার ডেফিনিশন থেকে উইজেটটি সম্পর্কে তথ্য সংগ্রহ করে। এই তথ্য ব্যবহার করে এটি উইজেটটির প্রতিনিধিত্বকারী একটি RemoteViews অবজেক্ট তৈরি করে।

নমুনা অ্যাপটি রিসিভার widgets.StatsWidgetProvider সংজ্ঞায়িত করে, যা StatsWidgetProvider ক্লাসের সাথে সঙ্গতিপূর্ণ:

<!-- app/src/main/AndroidManifest.xml -->

<receiver
  android:name=".widgets.StatsWidgetProvider"
  android:exported="false">
  <intent-filter>
    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  </intent-filter>
  <meta-data
    android:name="android.appwidget.provider"
    android:resource="@xml/stats_widget" />
</receiver>

StatsWidgetProvider ক্লাসটি StatsWidget অবজেক্ট তৈরির প্রক্রিয়া পরিচালনা করে StatsWidgetProvider.kt এটি নিম্নলিখিত দায়িত্বগুলো পালন করে:

  • উইজেট ইনস্ট্যান্স তৈরি করা এবং অ্যাপ ডেটাবেস থেকে অনুশীলনের ডেটা দিয়ে সেগুলোকে পূরণ করা।
  • formatDataAndSetWidget() ব্যবহার করে ওয়ার্কআউটের ডেটা সহজে পড়ার জন্য ফরম্যাট করা।
  • ওয়ার্কআউটের ডেটা অনুপলব্ধ থাকলে, setNoActivityDataWidget() ব্যবহার করে ডিফল্ট মান প্রদান করা হয়।

সহকারী সহায়তা যোগ করুন

এই কোডল্যাবে, আপনি অ্যাপ অ্যাকশন কার্যকারিতা পরিচালনা করার জন্য নমুনা অ্যাপটি আপডেট করবেন। এই পরিবর্তনগুলোর মধ্যে রয়েছে:

  1. StatsWidget অবজেক্টের একটি ইনস্ট্যান্স ফেরত দেওয়ার জন্য GET_EXERCISE_OBSERVATION BII ক্যাপাবিলিটি কনফিগার করা হচ্ছে।
  2. App Actions-এর বৈশিষ্ট্যগুলো ব্যবহার করার জন্য StatsWidget ক্লাসটি আপডেট করা, যেমন:
    • BII প্যারামিটার ব্যবহার করে, ব্যবহারকারীরা "হে গুগল, ExampleApp-এ আমার দৌড়ের পরিসংখ্যান দেখাও"-এর মতো প্রশ্ন করার মাধ্যমে নির্দিষ্ট ওয়ার্কআউটের পরিসংখ্যান দেখতে পারেন।
    • টিটিএস সূচনা স্ট্রিং প্রদান করা হচ্ছে।
    • বিশেষ পরিস্থিতিগুলো পরিচালনা করা, যেমন যখন ব্যবহারকারীর কোয়েরিতে ওয়ার্কআউট টাইপ প্যারামিটার অন্তর্ভুক্ত থাকে না।

৩. আপনার ডেভেলপমেন্ট পরিবেশ প্রস্তুত করুন

আপনার বেস ফাইলগুলি ডাউনলোড করুন

স্যাম্পল অ্যাপটির গিটহাব রিপোজিটরি ক্লোন করতে এই কমান্ডটি চালান:

git clone --branch start-widget-codelab https://github.com/actions-on-google/appactions-fitness-kotlin.git

রিপোজিটরিটি ক্লোন করার পর, অ্যান্ড্রয়েড স্টুডিওতে এটি খোলার জন্য এই ধাপগুলো অনুসরণ করুন:

  1. "Welcome to Android Studio" ডায়ালগ বক্সে, "Import project" -এ ক্লিক করুন।
  2. যে ফোল্ডারে আপনি রিপোজিটরিটি ক্লোন করেছেন, সেটি খুঁজুন এবং নির্বাচন করুন।

সম্পূর্ণ কোডল্যাবের সংস্করণটি দেখতে, --branch master ফ্ল্যাগ ব্যবহার করে স্যাম্পল অ্যাপ রিপোটি ক্লোন করুন।

অ্যান্ড্রয়েড অ্যাপ্লিকেশন আইডি আপডেট করুন

অ্যাপের অ্যাপ্লিকেশন আইডি আপডেট করলে আপনার টেস্ট ডিভাইসে অ্যাপটিকে একটি স্বতন্ত্র পরিচয় দেওয়া যায় এবং প্লে কনসোলে অ্যাপটি আপলোড করার সময় "ডুপ্লিকেট প্যাকেজ নেম" ত্রুটি এড়ানো যায়। অ্যাপ্লিকেশন আইডি আপডেট করতে, app/build.gradle খুলুন:

android {
...
  defaultConfig {
    applicationId "com.MYUNIQUENAME.android.fitactions"
    ...
  }
}

applicationId ফিল্ডে থাকা 'MYUNIQUENAME'-এর পরিবর্তে আপনার নিজস্ব কোনো অনন্য নাম ব্যবহার করুন।

টেস্ট প্লাগইন ইনস্টল করুন

গুগল অ্যাসিস্ট্যান্ট প্লাগইন আপনাকে একটি টেস্ট ডিভাইসে আপনার অ্যাপ অ্যাকশনগুলো পরীক্ষা করার সুযোগ দেয়। এটি আপনার অ্যান্ড্রয়েড ডিভাইসের গুগল অ্যাপের মাধ্যমে অ্যাসিস্ট্যান্টকে তথ্য পাঠিয়ে কাজ করে। যদি আপনার কাছে প্লাগইনটি আগে থেকে না থাকে, তবে এই ধাপগুলো অনুসরণ করে এটি ইনস্টল করুন:

  1. ফাইল > সেটিংস- এ যান (MacOS-এ Android Studio > Preferences )।
  2. প্লাগইন বিভাগে, মার্কেটপ্লেসে যান এবং "গুগল অ্যাসিস্ট্যান্ট" অনুসন্ধান করুন। এছাড়াও আপনি ম্যানুয়ালি টেস্ট টুলটি ডাউনলোড এবং ইনস্টল করতে পারেন।
  3. টুলটি ইনস্টল করুন এবং অ্যান্ড্রয়েড স্টুডিও পুনরায় চালু করুন।

আপনার ডিভাইসে অ্যাপটি পরীক্ষা করুন

অ্যাপটিতে আরও পরিবর্তন আনার আগে, নমুনা অ্যাপটি কী করতে পারে সে সম্পর্কে ধারণা থাকলে সুবিধা হয়।

আপনার টেস্ট ডিভাইসে অ্যাপটি চালান:

  1. অ্যান্ড্রয়েড স্টুডিওতে, আপনার ফিজিক্যাল বা ভার্চুয়াল ডিভাইসটি নির্বাচন করুন এবং রান > রান অ্যাপ নির্বাচন করুন অথবা রান-এ ক্লিক করুন। অ্যান্ড্রয়েড স্টুডিওতে অ্যাপ আইকনটি চালান। টুলবারে।
  2. অ্যাসিস্ট্যান্ট সেট আপ করতে এবং এটি কাজ করছে কিনা তা যাচাই করতে হোম বাটনটি দীর্ঘক্ষণ চেপে ধরুন। আপনি যদি আগে থেকে সাইন ইন না করে থাকেন, তবে আপনাকে আপনার ডিভাইসে অ্যাসিস্ট্যান্ট-এ সাইন ইন করতে হবে।

অ্যান্ড্রয়েড ভার্চুয়াল ডিভাইস সম্পর্কে আরও তথ্যের জন্য, ভার্চুয়াল ডিভাইস তৈরি এবং পরিচালনা দেখুন।

অ্যাপটি কী করতে পারে তা দেখতে সংক্ষেপে এটি ঘুরে দেখুন। অ্যাপটি আগে থেকেই ১০টি ব্যায়ামের তালিকা তৈরি করে রাখে এবং প্রথমবার দেখার সময় এই তথ্য প্রদর্শন করে।

বিদ্যমান উইজেটটি ব্যবহার করে দেখুন

  1. আপনার টেস্ট ডিভাইসটির হোম স্ক্রিনে যেতে হোম বাটনটি ট্যাপ করুন।
  2. হোম স্ক্রিনের খালি জায়গায় দীর্ঘক্ষণ চাপ দিন এবং উইজেট নির্বাচন করুন।
  3. উইজেট তালিকাটি স্ক্রল করে নিচে FitActions পর্যন্ত যান।
  4. FitActions আইকনটিতে দীর্ঘক্ষণ চাপ দিন এবং এর উইজেটটি হোম স্ক্রিনে রাখুন।

ডিভাইসের হোম স্ক্রিনে FitActions উইজেটটি প্রদর্শনকারী স্ক্রিনশট।

৪. অ্যাপ অ্যাকশন যোগ করুন

এই ধাপে, আপনি GET_EXERCISE_OBSERVATION BII ক্যাপাবিলিটিটি যোগ করবেন। এটি করার জন্য আপনাকে shortcuts.xml ফাইলে একটি নতুন capability এলিমেন্ট যোগ করতে হবে। এই ক্যাপাবিলিটিটি নির্দিষ্ট করে দেয় যে, ক্যাপাবিলিটিটি কীভাবে ট্রিগার করা হবে, BII প্যারামিটারগুলো কীভাবে ব্যবহার করা হবে এবং অনুরোধটি পূরণ করার জন্য কোন অ্যান্ড্রয়েড ইনটেন্টগুলোকে কল করা হবে।

  1. এই কনফিগারেশন সহ নমুনা প্রজেক্টের shortcuts.xml রিসোর্সে একটি নতুন capability এলিমেন্ট যোগ করুন:
    <!-- fitnessactions/app/src/main/res/xml/shortcuts.xml -->
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
      <app-widget
        android:identifier="GET_EXERCISE_OBSERVATION"
        android:targetClass="com.devrel.android.fitactions.widgets.StatsWidgetProvider"
        android:targetPackage="PUT_YOUR_APPLICATION_ID_HERE">
        <parameter
          android:name="exerciseObservation.aboutExercise.name"
          android:key="aboutExerciseName"
          android:required="true">
        </parameter>
        <extra android:name="hasTts" android:value="true"/>
      </app-widget>
      <!-- Add Fallback Intent-->
    </capability>
    
    android:targetPackage PUT_YOUR_APPLICATION_ID_HERE ভ্যালুটি আপনার অনন্য applicationId দিয়ে প্রতিস্থাপন করুন।

এই সক্ষমতাটি GET_EXERCISE_OBSERVATION BII-কে app-widget ইন্টেন্টের সাথে ম্যাপ করে, যাতে BII-টি ট্রিগার হলে উইজেটটি ইনস্ট্যানশিয়েট হয়ে ব্যবহারকারীকে দেখানো যায়।

উইজেটটি চালু করার আগে, অ্যাসিস্ট্যান্ট ব্যবহারকারীর কোয়েরি থেকে সমর্থিত BII প্যারামিটারগুলো সংগ্রহ করে। এই কোডল্যাবটির জন্য exerciseObservation.aboutExercise.name নামক BII প্যারামিটারটি প্রয়োজন, যা ব্যবহারকারীর অনুরোধ করা ব্যায়ামের ধরনকে নির্দেশ করে। অ্যাপটি তিনটি ব্যায়ামের ধরন সমর্থন করে: "দৌড়ানো", "হাঁটা" এবং "সাইক্লিং"। এই সমর্থিত মানগুলো সম্পর্কে অ্যাসিস্ট্যান্টকে জানানোর জন্য আপনাকে একটি ইনলাইন ইনভেন্টরি প্রদান করতে হবে।

  1. shortcuts.xml ফাইলে GET_EXERCISE_OBSERVATION ক্যাপাবিলিটির উপরে এই কনফিগারেশনটি যোগ করে এই ইনভেন্টরি উপাদানগুলো সংজ্ঞায়িত করুন:
    <!-- shortcuts.xml -->
    
    <!-- shortcuts are bound to the GET_EXERCISE_OBSERVATION capability and
         represent the types of exercises supported by the app. -->
    
    <shortcut
      android:shortcutId="running"
      android:shortcutShortLabel="@string/activity_running">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/runningSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <shortcut
      android:shortcutId="walking"
      android:shortcutShortLabel="@string/activity_walking">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/walkingSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <shortcut
      android:shortcutId="cycling"
      android:shortcutShortLabel="@string/activity_cycling">
      <capability-binding android:key="actions.intent.GET_EXERCISE_OBSERVATION">
        <parameter-binding
          android:key="exerciseObservation.aboutExercise.name"
          android:value="@array/cyclingSynonyms"/>
      </capability-binding>
    </shortcut>
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
      <!-- ... -->
    </capability>
    

ফলব্যাক ইন্টেন্ট যোগ করুন

ফলব্যাক ইন্টেন্ট এমন পরিস্থিতি সামাল দেয় যেখানে ক্যাপাবিলিটির জন্য প্রয়োজনীয় প্যারামিটার অনুপস্থিত থাকার কারণে ব্যবহারকারীর কোয়েরি পূরণ করা যায় না। GET_EXERCISE_OBSERVATION ক্যাপাবিলিটির জন্য exerciseObservation.aboutExercise.name প্যারামিটারটি প্রয়োজন, যা android:required="true" অ্যাট্রিবিউট দ্বারা নির্দিষ্ট করা থাকে। এই ধরনের পরিস্থিতিতে, অ্যাসিস্ট্যান্ট আপনাকে একটি ফলব্যাক ইন্টেন্ট সংজ্ঞায়িত করতে বলে, যাতে কোয়েরিতে কোনো প্যারামিটার প্রদান করা না হলেও অনুরোধটি সফল হতে পারে।

  1. shortcuts.xml ফাইলে, এই কনফিগারেশন ব্যবহার করে GET_EXERCISE_OBSERVATION ক্যাপাবিলিটিতে একটি ফলব্যাক ইন্টেন্ট যোগ করুন:
    <!-- shortcuts.xml -->
    
    <capability android:name="actions.intent.GET_EXERCISE_OBSERVATION">
    
      <app-widget>
        <!-- ... -->
      </app-widget>
    
      <!-- Fallback intent with no parameters needed to successfully execute.-->
      <intent
        android:identifier="GET_EXERCISE_OBSERVATION_FALLBACK"
        android:action="android.intent.action.VIEW"
        android:targetClass="com.devrel.android.fitactions.widgets.StatsWidgetProvider">
      </intent>
    </capability>
    

এই নমুনা কনফিগারেশনে, ফলব্যাক ফুলফিলমেন্ট হলো একটি অ্যান্ড্রয়েড ইন্টেন্ট যার Extra ডেটাতে কোনো প্যারামিটার নেই।

৫. অ্যাসিস্ট্যান্টের জন্য উইজেটটি সক্রিয় করুন।

GET_EXERCISE_OBSERVATION ক্যাপাবিলিটি প্রতিষ্ঠিত হয়ে গেলে, অ্যাপ অ্যাকশন ভয়েস ইনভোকেশন সমর্থন করার জন্য উইজেট ক্লাসটি আপডেট করুন।

উইজেট এক্সটেনশন লাইব্রেরি যোগ করুন

অ্যাপ অ্যাকশন উইজেটস এক্সটেনশন লাইব্রেরিটি ভয়েস-ভিত্তিক অ্যাসিস্ট্যান্ট অভিজ্ঞতার জন্য আপনার উইজেটগুলোকে উন্নত করে। বিশেষত, এটি আপনাকে আপনার উইজেটগুলোর জন্য একটি কাস্টম টিটিএস (TTS) ইন্ট্রোডাকশন প্রদান করতে সক্ষম করে।

  1. স্যাম্পল অ্যাপের /app/build.gradle রিসোর্সে উইজেটস এক্সটেনশন লাইব্রেরি ডিপেন্ডেন্সি যোগ করুন:
    // app/build.gradle
    
    dependencies {
      //...
      implementation "com.google.assistant.appactions:widgets:0.0.1"
    }
    
    অ্যান্ড্রয়েড স্টুডিওতে প্রদর্শিত সতর্কীকরণ বাক্সে ‘সিঙ্ক নাও’ (Sync Now) বোতামে ক্লিক করুন। প্রতিবার build.gradle পরিবর্তনের পর সিঙ্ক করলে অ্যাপটি বিল্ড করার সময় ত্রুটি এড়ানো যায়।

উইজেট পরিষেবা যোগ করুন

সার্ভিস হলো অ্যাপ্লিকেশনের এমন একটি উপাদান যা ব্যাকগ্রাউন্ডে দীর্ঘ সময় ধরে চলা কার্যক্রম সম্পাদন করতে পারে। উইজেটের অনুরোধগুলো প্রসেস করার জন্য আপনার অ্যাপে একটি সার্ভিস থাকা প্রয়োজন।

  1. এই কনফিগারেশন সহ স্যাম্পল অ্যাপের AndroidManifest.xml রিসোর্সে একটি সার্ভিস যোগ করুন:
    <!-- AndroidManifest.xml -->
    <service
       android:name=".widgets.StatsWidgetProvider"
       android:enabled="true"
       android:exported="true">
       <intent-filter>
           <action
               android:name="com.google.assistant.appactions.widgets.PIN_APP_WIDGET" />
       </intent-filter>
    </service>
    
    

ভয়েস কোয়েরির মাধ্যমে উইজেট পূরণের প্রক্রিয়া শুরু হলে, অ্যাসিস্ট্যান্ট অ্যাপে অনুরোধ পাঠাতে এই সার্ভিসটি ব্যবহার করে। সার্ভিসটি BII ডেটা সহ অনুরোধটি গ্রহণ করে। সার্ভিসটি এই ডেটা ব্যবহার করে অ্যাসিস্ট্যান্টের মধ্যে রেন্ডার করার জন্য একটি RemoteView উইজেট অবজেক্ট তৈরি করে।

উইজেট ক্লাস আপডেট করুন

আপনার অ্যাপটি এখন GET_EXERCISE_OBSERVATION ক্যাপাবিলিটি রিকোয়েস্টগুলোকে আপনার উইজেট ক্লাসে রাউট করার জন্য কনফিগার করা হয়েছে। এরপর, BII প্যারামিটার ভ্যালু ব্যবহার করে ব্যবহারকারীর অনুরোধ অনুযায়ী একটি ব্যক্তিগতকৃত উইজেট ইনস্ট্যান্স তৈরি করতে StatsWidget.kt ক্লাসটি আপডেট করুন।

  1. StatsWidget.kt ক্লাসটি খুলুন এবং App Actions Widget Extension লাইব্রেরিটি ইম্পোর্ট করুন:
    // StatsWidget.kt
    
    // ... Other import statements
    import com.google.assistant.appactions.widgets.AppActionsWidgetExtension
    
    
  2. এই প্রাইভেট ভেরিয়েবলগুলো যোগ করুন, যেগুলো আপনি উইজেটে কোন তথ্য পূরণ করা হবে তা নির্ধারণ করতে ব্যবহার করেন:
    // StatsWidget.kt
    
    private val hasBii: Boolean
    private val isFallbackIntent: Boolean
    private val aboutExerciseName: String
    private val exerciseType: FitActivity.Type
    
  3. ক্লাসটিকে অ্যাসিস্ট্যান্ট থেকে পাঠানো উইজেট অপশন ডেটা ব্যবহার করার সুযোগ দিতে init ফাংশনটি যোগ করুন:
    // StatsWidget.kt
    
    init {
      val optionsBundle = appWidgetManager.getAppWidgetOptions(appWidgetId)
      val bii = optionsBundle.getString(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_BII)
      hasBii = !bii.isNullOrBlank()
      val params = optionsBundle.getBundle(AppActionsWidgetExtension.EXTRA_APP_ACTIONS_PARAMS)
    
      if (params != null) {
        isFallbackIntent = params.isEmpty
        if (isFallbackIntent) {
          aboutExerciseName = context.resources.getString(R.string.activity_unknown)
        } else {
            aboutExerciseName = params.get("aboutExerciseName") as String
          }
      } else {
          isFallbackIntent = false
          aboutExerciseName = context.resources.getString(R.string.activity_unknown)
      }
      exerciseType = FitActivity.Type.find(aboutExerciseName)
    }
    
    

চলুন দেখে নেওয়া যাক, কীভাবে এই আপডেটগুলো StatsWidget.kt ক্লাসকে GET_EXERCISE_OBSERVATION ক্যাপাবিলিটি দ্বারা তৈরি অ্যান্ড্রয়েড ইন্টেন্টগুলোতে সাড়া দিতে সক্ষম করে:

  • optionsBundle = বান্ডেল
    • বান্ডেল হলো এমন অবজেক্ট যা বিভিন্ন প্রসেসের সীমানা পেরিয়ে, ইন্টেন্টযুক্ত অ্যাক্টিভিটিগুলোর মধ্যে এবং কনফিগারেশন পরিবর্তনের সময় ক্ষণস্থায়ী অবস্থা সংরক্ষণ করার জন্য ব্যবহৃত হয়। অ্যাসিস্ট্যান্ট উইজেটে কনফিগারেশন ডেটা পাঠানোর জন্য Bundle অবজেক্ট ব্যবহার করে।
  • bii = actions.intent.GET_EXERCISE_OBSERVATION
    • AppActionsWidgetExtension ব্যবহার করে বান্ডেল থেকে BII-এর নামটি পাওয়া যায়।
  • hasBii = true
    • BII আছে কিনা তা যাচাই করে দেখা হয়।
  • params = Bundle[{aboutExerciseName=running}]
    • অ্যাপ অ্যাকশন দ্বারা তৈরি একটি বিশেষ বান্ডেল, উইজেট অপশন Bundle ভিতরে নেস্টেড থাকে। এতে BII-এর কী/ভ্যালু পেয়ারগুলো থাকে। এই ক্ষেত্রে, "Hey Google, show my running stats on ExampleApp" এই উদাহরণ কোয়েরি থেকে ' running ভ্যালুটি নেওয়া হয়েছে।
  • isFallbackIntent = false
    • ইনটেন্ট Extras এ প্রয়োজনীয় BII প্যারামিটারগুলোর উপস্থিতি যাচাই করে।
  • aboutExerciseName = running
    • aboutExerciseName এর জন্য ইন্টেন্ট Extras ভ্যালুটি পায়।
  • exerciseType = RUNNING
    • সংশ্লিষ্ট ডাটাবেস টাইপ অবজেক্টটি খুঁজে বের করার জন্য aboutExerciseName ব্যবহার করা হয়।

এখন যেহেতু StatsWidget ক্লাসটি আগত অ্যাপ অ্যাকশন অ্যান্ড্রয়েড ইন্টেন্ট ডেটা প্রসেস করতে পারে, তাই উইজেটটি কোনো অ্যাপ অ্যাকশন দ্বারা ট্রিগার হয়েছে কিনা তা পরীক্ষা করার জন্য উইজেট তৈরির ফ্লো লজিকটি আপডেট করুন।

  1. StatsWidget.kt ফাইলে, updateAppWidget() ফাংশনটি এই কোড দিয়ে প্রতিস্থাপন করুন:
    // StatsWidget.kt
    
    fun updateAppWidget() {
       /**
        * Checks for App Actions BII invocation and if BII parameter data is present.
        * If parameter data is missing, use data from last exercise recorded to the
        *  fitness tracking database.
        */
       if (hasBii && !isFallbackIntent) {
           observeAndUpdateRequestedExercise()
       } else observeAndUpdateLastExercise()
    }
    
    

পূর্ববর্তী কোডটি observeAndUpdateRequestedExercise নামক একটি নতুন ফাংশনকে নির্দেশ করে। এই ফাংশনটি অ্যাপ অ্যাকশনস অ্যান্ড্রয়েড ইন্টেন্ট দ্বারা প্রেরিত exerciseType প্যারামিটার data ব্যবহার করে উইজেট ডেটা তৈরি করে।

  1. এই কোড দিয়ে observeAndUpdateRequestedExercise ফাংশনটি যোগ করুন:
    // StatsWidget.kt
    
    /**
    * Create and observe the last exerciseType activity LiveData.
    */
    private fun observeAndUpdateRequestedExercise() {
      val activityData = repository.getLastActivities(1, exerciseType)
    
       activityData.observeOnce { activitiesStat ->
           if (activitiesStat.isNotEmpty()) {
               formatDataAndSetWidget(activitiesStat[0])
               updateWidget()
           } else {
               setNoActivityDataWidget()
               updateWidget()
           }
       }
    }
    
    

পূর্ববর্তী কোডে, অ্যাপের লোকাল ডাটাবেস থেকে ফিটনেস ডেটা পুনরুদ্ধার করতে অ্যাপে থাকা একটি বিদ্যমান রিপোজিটরি ক্লাস ব্যবহার করা হয়েছে। এই ক্লাসটি একটি এপিআই (API) প্রদান করে যা ডাটাবেসে অ্যাক্সেসকে সহজ করে। ডাটাবেসে কোয়েরি চালানোর সময় রিপোজিটরিটি একটি LiveData অবজেক্ট প্রকাশ করার মাধ্যমে কাজ করে। আপনার কোডে, সর্বশেষ ফিটনেস অ্যাক্টিভিটি পুনরুদ্ধার করতে আপনি এই LiveData অবজার্ভ করেন।

টিটিএস সক্রিয় করুন

আপনার উইজেট প্রদর্শন করার সময় অ্যাসিস্ট্যান্টকে ঘোষণা করার জন্য আপনি একটি TTS স্ট্রিং প্রদান করতে পারেন। আপনার উইজেটগুলির সাথে শ্রাব্য প্রেক্ষাপট যোগ করার জন্য আমরা এটি অন্তর্ভুক্ত করার পরামর্শ দিই। এই কার্যকারিতাটি অ্যাপ অ্যাকশনস উইজেটস এক্সটেনশন লাইব্রেরি দ্বারা সরবরাহ করা হয়, যা আপনাকে অ্যাসিস্ট্যান্টে আপনার উইজেটগুলির সাথে থাকা টেক্সট এবং TTS পরিচিতি সেট করতে দেয়।

আপনার TTS পরিচিতি দেওয়ার জন্য একটি ভালো জায়গা হলো formatDataAndSetWidget ফাংশন, যা অ্যাপ ডেটাবেস থেকে ফেরত আসা অ্যাক্টিভিটি ডেটা ফরম্যাট করে।

  1. StatsWidget.kt ফাইলে, formatDataAndSetWidget ফাংশনে এই কোডটি যোগ করুন:
    // StatsWidget.kt
    
    private fun formatDataAndSetWidget(
      activityStat: FitActivity,
    ) {
          // ...
    
          // Add conditional for hasBii for widget with data
          if (hasBii) {
             // Formats TTS speech and display text for Assistant
             val speechText = context.getString(
                 R.string.widget_activity_speech,
                 activityExerciseTypeFormatted,
                 formattedDate,
                 durationInMin,
                 distanceInKm
             )
             val displayText = context.getString(
                 R.string.widget_activity_text,
                 activityExerciseTypeFormatted,
                 formattedDate
             )
             setTts(speechText, displayText)
          }
    }
    
    

পূর্ববর্তী কোডটিতে দুটি স্ট্রিং রিসোর্সের উল্লেখ করা হয়েছে: একটি স্পিচের জন্য এবং অন্যটি টেক্সটের জন্য। টিটিএস (TTS) সুপারিশের জন্য আমাদের উইজেট ভিডিওর ' টেক্সট-টু-স্পিচ স্টাইল সুপারিশ' অংশটি দেখুন। এই স্যাম্পলটিতে setTts নামক একটি নতুন ফাংশনেরও উল্লেখ রয়েছে, যা উইজেট ইনস্ট্যান্সকে টিটিএস তথ্য সরবরাহ করে।

  1. এই কোডটি ব্যবহার করে StatsWidget.kt তে এই নতুন setTts ফাংশনটি যোগ করুন:
    // StatsWidget.kt
    
    /**
     * Sets TTS to widget
     */
    private fun setTts(
      speechText: String,
      displayText: String,
    ) {
      val appActionsWidgetExtension: AppActionsWidgetExtension =
          AppActionsWidgetExtension.newBuilder(appWidgetManager)
            .setResponseSpeech(speechText)  // TTS to be played back to the user
            .setResponseText(displayText)  // Response text to be displayed in Assistant
            .build()
    
      // Update widget with TTS
      appActionsWidgetExtension.updateWidget(appWidgetId)
    }
    

অবশেষে, অনুরোধ করা ওয়ার্কআউট টাইপের জন্য এক্সারসাইজ ডেটাবেস থেকে খালি ডেটা পাওয়া গেলে TTS তথ্য সেট করার মাধ্যমে TTS লজিকটি সম্পূর্ণ করুন।

  1. StatsWidget.kt এর setNoActivityDataWidget() ফাংশনটি এই কোড দিয়ে আপডেট করুন:
    // StatsWidget.kt
    
    private fun setNoActivityDataWidget() {
      // ...
      // Add conditional for hasBii for widget without data
      if (hasBii) {
        // formats speech and display text for Assistant
        // https://developers.google.com/assistant/app/widgets#library
        val speechText =
          context.getString(R.string.widget_no_activity_speech, aboutExerciseName)
        val displayText =
          context.getString(R.string.widget_no_activity_text)
    
        setTts(speechText, displayText)
      }
    }
    

৬. অ্যাপের কার্যকলাপ পরীক্ষা করুন

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

একটি প্রিভিউ তৈরি করুন

প্লাগইন দিয়ে আপনার অ্যাপ অ্যাকশন পরীক্ষা করতে:

  1. টুলস > গুগল অ্যাসিস্ট্যান্ট > অ্যাপ অ্যাকশনস টেস্ট টুল- এ যান। আপনাকে আপনার গুগল অ্যাকাউন্ট ব্যবহার করে অ্যান্ড্রয়েড স্টুডিওতে সাইন ইন করতে বলা হতে পারে।
  2. 'Create Preview'-তে ক্লিক করুন। জিজ্ঞাসা করা হলে, অ্যাপ অ্যাকশন নীতিমালা এবং পরিষেবার শর্তাবলী পর্যালোচনা করে গ্রহণ করুন।

একটি প্রত্যাশিত ব্যায়ামের ধরণ পরীক্ষা করুন

টেস্ট টুলে এই ধাপগুলো অনুসরণ করে অ্যাপে সম্পন্ন হওয়া সর্বশেষ রান সম্পর্কিত তথ্য প্রদর্শনকারী একটি উইজেট ফেরত দিন:

  1. প্রথম ধাপে, যেখানে টুলটি আপনাকে একটি BII নির্বাচন ও কনফিগার করতে বলে, সেখানে actions.intent.GET_EXERCISE_OBSERVATION নির্বাচন করুন।
  2. exerciseObservation বক্সে, ডিফল্ট Exercise name-টি climbing থেকে run এ পরিবর্তন করুন।
  3. রান অ্যাপ অ্যাকশন-এ ক্লিক করুন।

গুগল অ্যাসিস্ট্যান্ট প্লাগইন ব্যবহার করে প্রাপ্ত একটি উইজেট দেখানো স্ক্রিন।

একটি অপ্রত্যাশিত ব্যায়ামের ধরণ পরীক্ষা করুন

টেস্ট টুলে একটি অপ্রত্যাশিত অনুশীলনের ধরণ পরীক্ষা করতে:

  1. exerciseObservation বক্সে, name ভ্যালুটি Run থেকে Climbing এ আপডেট করুন।
  2. রান অ্যাপ অ্যাকশন-এ ক্লিক করুন।

অ্যাসিস্ট্যান্টের উচিত "কোনো কার্যকলাপ পাওয়া যায়নি" তথ্য প্রদর্শনকারী একটি উইজেট ফেরত দেওয়া।

গুগল অ্যাসিস্ট্যান্ট প্লাগইন ব্যবহার করে প্রাপ্ত কোনো ব্যায়ামের তথ্য ছাড়া একটি উইজেট দেখানো স্ক্রিন।

ফলব্যাক ইন্টেন্ট পরীক্ষা করুন

যেসব কোয়েরি ফলব্যাক ইন্টেন্ট ট্রিগার করবে, সেগুলোর রিটার্ন হিসেবে এমন একটি উইজেট থাকা উচিত যা যেকোনো ধরনের ব্যায়ামের সর্বশেষ লগ করা কার্যকলাপ সম্পর্কিত তথ্য প্রদর্শন করবে।

ফলব্যাক ইন্টেন্ট পরীক্ষা করতে:

  1. exerciseObservation বক্সে, aboutExercise অবজেক্টটি মুছে ফেলুন।
  2. রান অ্যাপ অ্যাকশন-এ ক্লিক করুন।

অ্যাসিস্ট্যান্টের সর্বশেষ সম্পন্ন করা অনুশীলনের তথ্য প্রদর্শনকারী একটি উইজেট ফেরত দেওয়া উচিত।

গুগল অ্যাসিস্ট্যান্ট প্লাগইন ব্যবহার করে সর্বশেষ রেকর্ড করা কার্যকলাপ প্রদর্শনকারী একটি উইজেটসহ স্ক্রিন।

৭. পরবর্তী পদক্ষেপ

অভিনন্দন!

এখন আপনি অ্যাসিস্ট্যান্ট সহ একটি অ্যান্ড্রয়েড উইজেট ব্যবহার করে ব্যবহারকারীদের জিজ্ঞাসার উত্তর দিতে পারবেন।

আমরা যা আলোচনা করেছি

এই কোডল্যাবে, আপনি শিখেছেন কীভাবে:

  • একটি BII-তে একটি অ্যাপ উইজেট যোগ করুন।
  • অ্যান্ড্রয়েড এক্সট্রাস থেকে প্যারামিটার অ্যাক্সেস করার জন্য একটি উইজেট পরিবর্তন করুন।

এরপর কী?

এখান থেকে, আপনি আপনার ফিটনেস অ্যাপটিতে আরও কিছু পরিমার্জন করার চেষ্টা করতে পারেন। সম্পূর্ণ প্রজেক্টটি দেখতে, গিটহাবে মূল রিপোটি দেখুন।

অ্যাপ অ্যাকশন ব্যবহার করে এই অ্যাপটিকে আরও উন্নত করার বিষয়ে জানার জন্য এখানে কিছু পরামর্শ দেওয়া হলো:

আপনার ‘অ্যাকশনস অন গুগল’ যাত্রা অব্যাহত রাখতে, এই রিসোর্সগুলো অন্বেষণ করুন:

আমাদের সর্বশেষ ঘোষণাগুলো সম্পর্কে জানতে টুইটারে @ActionsOnGoogle- এ আমাদের অনুসরণ করুন, এবং আপনি যা তৈরি করেছেন তা শেয়ার করতে #appactions- এ টুইট করুন!

মতামত সমীক্ষা

অবশেষে, এই কোডল্যাবটির সাথে আপনার অভিজ্ঞতা সম্পর্কে মতামত জানাতে অনুগ্রহ করে এই সমীক্ষাটি পূরণ করুন