دمج تطبيقات Android المصغّرة مع "مساعد Google"

1. نظرة عامة

في الدرس التطبيقي الأول حول ترميز "مهامّ في التطبيقات"، تعلمت كيفية توسيع نطاق "مساعد Google" ليشمل تطبيق لياقة بدنية من خلال تنفيذ أهداف مضمَّنة (BII) من فئة "الصحة واللياقة البدنية" BII.

تتيح ميزة "المهام في التطبيقات" للمستخدمين تشغيل ميزات معيّنة مباشرةً من "مساعد Google" من خلال توجيه طلبات مثل "Ok Google، أريد بدء عملية تشغيل على ExampleApp". بالإضافة إلى إطلاق التطبيقات، يمكن أن يعرض "مساعد Google" للمستخدم تطبيق Android مصغّرًا تفاعليًا لتلبية طلبات مؤشرات BII المؤهَّلة.

شاشة تعرض أداة "مساعد Google" وهي تعرض تطبيقًا مصغّرًا استجابةً\nلطلب من المستخدم أدى إلى تفعيل ميزة GET_EXERCISE_OBSERVATION BII في التطبيقات.

ما الذي ستقوم ببنائه

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية إرجاع تطبيقات Android المصغّرة لتلبية طلبات مستخدمي "مساعد Google". ويمكنك أيضًا معرفة ما يلي:

  • مَعلمات المستخدم BII لتخصيص التطبيقات المصغّرة
  • يمكنك توفير مقدمات ميزة "تحويل النص إلى كلام" في "مساعد Google" لتطبيقاتك المصغّرة.
  • استخدِم مرجع intent المدمَج لتحديد BII المتوافقة مع تنفيذ التطبيقات المصغّرة.

المتطلبات الأساسية

قبل المتابعة، يُرجى التأكّد من أنّ بيئة التطوير جاهزة لتطوير خدمة "مهامّ في التطبيقات". يجب أن يحتوي على:

  • وحدة طرفية لتشغيل أوامر واجهة الأوامر، مع تثبيت git
  • يشير إلى أحدث إصدار ثابت من استوديو Android.
  • جهاز Android فعلي أو افتراضي مزود بإمكانية الاتصال بالإنترنت.
  • حساب Google تم تسجيل الدخول منه إلى "استوديو Android" وتطبيق Google وتطبيق "مساعد Google"

إذا كنت تستخدم جهازًا ماديًا، عليك توصيله بجهاز التطوير المحلي.

2. التعرّف على طريقة العمل

يستخدم "مساعد Google" تقنية "فهم اللغة الطبيعية" (NLU) لقراءة طلب المستخدم ومطابقته مع طلب intent مدمج في "مساعد Google" (BII). بعد ذلك، يربط "مساعد Google" الغرض بالوظيفة (التي تنفِّذ BII)، التي تسجّلها في تطبيقك لهذا الغرض. وأخيرًا، ينفّذ "مساعد Google" طلب المستخدم من خلال عرض تطبيق Android المصغّر الذي ينشئه تطبيقك باستخدام التفاصيل المتوفّرة في هذه الميزة.

في هذا الدرس التطبيقي حول الترميز، يمكنك تحديد إمكانية تُسجِّل الدعم لـ GET_EXERCISE_OBSERVATION BII. في هذه الميزة، أنت تطلب من "مساعد Google" إنشاء آلية Android intent لفئة التطبيق المصغّرة FitActions لتنفيذ طلبات ”BII“. يمكنك تعديل هذا الصف لإنشاء تطبيق مصغّر مخصّص ليعرضه "مساعد Google" للمستخدم ومقدمة عن تقنية تحويل النص إلى كلام ليعلِن عنها "مساعد Google".

يوضح المخطّط التالي هذا التدفق:

رسم بياني للتدفق يوضّح تنفيذ تطبيق "مساعد Google" المصغّر.

أداة 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، وهي StatsWidgetProvider.kt، مسارات إنشاء العناصر StatsWidget. تتعامل مع هذه المسئوليات:

  • إنشاء مثيلات الأداة وملؤها ببيانات التمرين من قاعدة بيانات التطبيق.
  • جارٍ تنسيق بيانات التمارين لسهولة القراءة، باستخدام formatDataAndSetWidget().
  • توفير قيم تلقائية في حال عدم توفّر بيانات التمارين، وذلك باستخدام ميزة "setNoActivityDataWidget()"

إضافة دعم "مساعد Google"

في هذا الدرس التطبيقي حول الترميز، يمكنك تحديث نموذج التطبيق للتعامل مع وظائف "إجراءات التطبيقات". وتشمل هذه التغييرات ما يلي:

  1. جارٍ ضبط إمكانية GET_EXERCISE_OBSERVATION BII لعرض نسخة افتراضية من الكائن StatsWidget.
  2. جارٍ تعديل فئة "StatsWidget" لاستخدام ميزات "مهامّ في التطبيقات"، مثل:
    • استخدام مَعلمات BII، ما يتيح للمستخدمين الاطّلاع على إحصاءات تمارين معيّنة عبر توجيه طلبات مثل "Ok Google، أريد عرض إحصاءات الجري على ExampleApp"
    • تقديم سلاسل مقدمة لتقنية تحويل النص إلى كلام (TTS).
    • إدارة الحالات الخاصة، مثل الحالات التي لا يتضمّن فيها طلب بحث المستخدم مَعلمة لنوع التمرين

3- إعداد بيئة التطوير

تنزيل ملفاتك الأساسية

شغِّل هذا الأمر لاستنساخ نموذج مستودع GitHub للتطبيق:

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

بعد استنساخ المستودع، اتّبِع الخطوات التالية لفتحه في "استوديو Android":

  1. في مربّع الحوار "مرحبًا بك في استوديو Android"، انقر على استيراد مشروع.
  2. ابحث عن المجلد الذي استنسخت المستودع فيه واختَره.

للاطّلاع على إصدار من التطبيق الذي يمثّل الدرس التطبيقي المكتمل حول الترميز، عليك استنساخ نموذج مستودع التطبيق باستخدام العلامة --branch master.

تعديل رقم تعريف تطبيق Android

يؤدي تعديل معرّف التطبيق الخاص بالتطبيق إلى التعرّف على التطبيق بشكلٍ فريد على الجهاز الاختباري وتجنُّب ظهور "اسم حزمة مكرّر". إذا تم تحميل التطبيق على Play Console. لتعديل معرّف التطبيق، افتح app/build.gradle:

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

استبدال "MYUNIQUENAME" في الحقل applicationId إلى معلومات فريدة لك.

تثبيت المكوّن الإضافي للاختبار

يتيح لك مكوّن "مساعد Google" الإضافي اختبار خدمة "مهامّ في التطبيقات" على جهاز اختبار. يتم تفعيل الميزة عن طريق إرسال معلومات إلى "مساعد Google" من خلال تطبيق Google على جهاز Android. إذا لم يكن المكوّن الإضافي متوفرًا لديك، يمكنك تثبيته باتّباع الخطوات التالية:

  1. انتقل إلى ملف > الإعدادات (استوديو Android > الإعدادات المفضّلة على نظام التشغيل MacOS).
  2. في قسم "المكوّنات الإضافية"، انتقِل إلى السوق وابحث عن "مساعد Google". يمكنك أيضًا تنزيل أداة الاختبار وتثبيتها يدويًا.
  3. ثبِّت الأداة وأعِد تشغيل "استوديو Android".

اختبار التطبيق على جهازك

قبل إجراء المزيد من التغييرات على التطبيق، من المفيد الحصول على فكرة عما يمكن أن يفعله نموذج التطبيق.

تشغيل التطبيق على جهاز الاختبار:

  1. في "استوديو Android"، اختَر الجهاز الفعلي أو الافتراضي وانقر على تشغيل >. شغِّل التطبيق أو انقر على تشغيلتشغيل رمز التطبيق في &quot;استوديو Android&quot; في شريط الأدوات.
  2. اضغط مع الاستمرار على زر الشاشة الرئيسية لإعداد "مساعد Google" والتأكّد من أنّه يعمل. عليك تسجيل الدخول إلى "مساعد Google" على جهازك، إذا لم يسبق لك إجراء ذلك.

لمزيد من المعلومات حول أجهزة Android الافتراضية، يُرجى الاطّلاع على مقالة إنشاء الأجهزة الافتراضية وإدارتها.

استكشف التطبيق بإيجاز لمعرفة ما يمكنه فعله. يملأ التطبيق 10 أنشطة تمارين تلقائيًا ويعرض هذه المعلومات من العرض الأول.

تجربة التطبيق المصغّر الحالي

  1. انقر على زر الشاشة الرئيسية للانتقال إلى الشاشة الرئيسية للجهاز الاختباري.
  2. اضغط مع الاستمرار على مساحة فارغة في الشاشة الرئيسية واختَر التطبيقات المصغّرة.
  3. انتقِل للأسفل في قائمة التطبيقات المصغّرة للوصول إلى FitActions.
  4. اضغط مع الاستمرار على رمز FitActions وضعه على الشاشة الرئيسية.

لقطة شاشة تعرض تطبيق FitActions على الشاشة الرئيسية للجهاز

4. إضافة إجراء التطبيق

في هذه الخطوة، يمكنك إضافة إمكانية GET_EXERCISE_OBSERVATION BII. ويمكنك إجراء ذلك من خلال إضافة عنصر capability جديد في shortcuts.xml. تحدّد هذه الميزة كيفية تشغيل الميزة، وكيفية استخدام مَعلمات BII، ونية Android لتنفيذ الطلب.

  1. أضِف عنصر capability جديدًا إلى نموذج مورد المشروع shortcuts.xml باستخدام هذه الإعدادات:
    <!-- 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>
    
    استبدِل قيمة PUT_YOUR_APPLICATION_ID_HERE، android:targetPackage، بقيمة applicationId الفريدة.

تربط هذه الميزة GET_EXERCISE_OBSERVATION BII بالهدف app-widget، وبالتالي عند تشغيل BII، يتم إنشاء مثيل للأداة وعرضها للمستخدم.

قبل تشغيل التطبيق المصغّر، يستخلص "مساعد Google" مَعلمات BII المتوافقة من طلب بحث المستخدم. يتطلّب هذا الدرس التطبيقي حول الترميز مَعلمة BII exerciseObservation.aboutExercise.name التي تمثّل نوع التمرين الذي طلبه المستخدم. يتوافق التطبيق مع ثلاثة أنواع من التمارين: "الجري" و"المشي" و"ركوب الدراجات". ويجب توفير مستودع مضمّن لإبلاغ "مساعد Google" بهذه القيم المسموح بها.

  1. تحديد عناصر المستودع هذه من خلال إضافة هذه الإعدادات، أعلى إمكانية GET_EXERCISE_OBSERVATION، إلى shortcuts.xml:
    <!-- 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". في هذه الحالات، يطلب منك "مساعد Google" تحديد هدف احتياطي للسماح بنجاح الطلب، حتى إذا لم يتم توفير أي مَعلمات في طلب البحث.

  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>
    

في نموذج الإعدادات هذا، يكون التنفيذ الاحتياطي عبارة عن هدف Android بدون معلَمات في بيانات Extra.

5- تفعيل التطبيق المصغّر في "مساعد Google"

بعد إنشاء إمكانية GET_EXERCISE_OBSERVATION، يمكنك تحديث فئة التطبيق المصغّر لإتاحة الاستدعاء الصوتي في "مهامّ في التطبيقات".

إضافة مكتبة إضافة Widgets

تعمل مكتبة إضافة التطبيقات المصغّرة على تحسين التطبيقات المصغّرة لتجارب "مساعد Google" التي تستخدم ميزة إعادة التوجيه الصوتي. وعلى وجه التحديد، تمكّنك الخدمة من توفير مقدمة مخصّصة لتقنية "تحويل النص إلى كلام" (TTS) لتطبيقاتك.

  1. أضِف تبعية مكتبة إضافة التطبيقات المصغّرة إلى نموذج مورد /app/build.gradle للتطبيق:
    // app/build.gradle
    
    dependencies {
      //...
      implementation "com.google.assistant.appactions:widgets:0.0.1"
    }
    
    انقر على المزامنة الآن في مربّع التحذير الذي يظهر في "استوديو Android". تساعدك المزامنة بعد كل تغيير في 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>
    
    

يستخدم "مساعد Google" هذه الخدمة لإرسال الطلبات إلى التطبيق عند إجراء طلب صوتي يؤدي إلى تنفيذ التطبيقات المصغّرة. تتلقّى الخدمة الطلب مع بيانات BII. تستخدم الخدمة هذه البيانات لإنشاء عنصر مصغّر RemoteView لعرضه في "مساعد Google".

تعديل فئة التطبيق المصغّر

تم إعداد تطبيقك الآن لتوجيه طلبات إمكانات GET_EXERCISE_OBSERVATION إلى فئة التطبيق المصغّر. بعد ذلك، عليك تعديل الفئة StatsWidget.kt لإنشاء مثيل أداة يتم تخصيصه بناءً على طلب المستخدم، وذلك باستخدام قيم مَعلمات BII.

  1. افتح فئة StatsWidget.kt واستورِد مكتبة إضافة أداة "مهامّ في التطبيقات":
    // 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 للسماح للصف باستخدام بيانات خيارات الأداة التي يتم تمريرها من "مساعد Google":
    // 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 الاستجابة لأهداف Android التي تم إنشاؤها من خلال ميزة GET_EXERCISE_OBSERVATION:

  • optionsBundle = حزمة
    • الحِزم هي كائنات مصمَّمة للاستخدام عبر حدود العملية، وبين الأنشطة ذات الأهداف، وتخزين الحالة المؤقتة على مستوى تغييرات الضبط. يستخدم "مساعد Google" عناصر Bundle لتمرير بيانات الإعداد إلى التطبيق المصغّر.
  • bii = actions.intent.GET_EXERCISE_OBSERVATION
    • ويتوفّر اسم BII من الحزمة باستخدام AppActionsWidgetExtension.
  • hasBii = true
    • يتم التحقق لمعرفة ما إذا كان هناك BII.
  • params = Bundle[{aboutExerciseName=running}]
    • يتم دمج حِزمة خاصة تم إنشاؤها باستخدام خدمة "مهامّ في التطبيقات" داخل خيارات التطبيق المصغّر Bundle. يحتوي على أزواج المفتاح/القيمة من BII. في هذه الحالة، تم استخراج القيمة running من مثال طلب البحث "Ok Google، أريد عرض إحصاءات الجري على ExampleApp".
  • isFallbackIntent = false
    • يتحقّق من توفّر مَعلمات BII المطلوبة في الغرض Extras.
  • aboutExerciseName = running
    • تحصل على قيمة Extras الغرض لـ aboutExerciseName.
  • exerciseType = RUNNING
    • تستخدم هذه الدالة aboutExerciseName للبحث عن كائن نوع قاعدة البيانات المقابل.

والآن بعد أن أصبح بإمكان الفئة StatsWidget معالجة البيانات الواردة من Android لـ "مهامّ في التطبيقات"، عليك تعديل منطق عملية إنشاء التطبيق المصغّر للتحقّق مما إذا كان قد تم تشغيل الأداة من خلال "إجراء تطبيق".

  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 التي يتم تمريرها من خلال هدف Android في "إجراءات التطبيقات".

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

في الرمز السابق، استخدِم فئة مستودع حالية تم العثور عليها في التطبيق لاسترداد بيانات اللياقة البدنية من قاعدة بيانات التطبيق المحلية. توفّر هذه الفئة واجهة برمجة تطبيقات تسهِّل إمكانية الوصول إلى قاعدة البيانات. يعمل المستودع عن طريق عرض كائن LiveData عند إجراء طلبات بحث مقابل قاعدة البيانات. في رمزك، تلاحظ هذا LiveData لاسترداد آخر نشاط للياقة البدنية.

تفعيل ميزة "تحويل النص إلى كلام"

يمكنك تقديم سلسلة "تحويل النص إلى كلام" لكي يعلن عنها "مساعد Google" عند عرض تطبيقك المصغّر. ننصحك بتضمين هذه السمة لتوفير سياق مسموع باستخدام التطبيقات المصغّرة. ويتم توفير هذه الوظيفة من خلال مكتبة إضافات التطبيقات المصغّرة الخاصة بـ "مهامّ في التطبيقات"، والتي تتيح لك إعداد النصوص ومقدّمات "تحويل النص إلى كلام" المصاحبة للأدوات في "مساعد Google".

تُعد الدالة formatDataAndSetWidget مكانًا جيدًا لتقديم مقدمة عن تقنية تحويل النص إلى كلام (TTS) التي تنسق بيانات النشاط التي يتم عرضها من قاعدة بيانات التطبيق.

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

يشير الرمز السابق إلى مصدري سلسلة: أحدهما للكلام والآخر للنص. يمكنك مشاهدة الجزء اقتراح نمط تحويل النص إلى كلام في فيديو التطبيقات المصغّرة للحصول على اقتراحات لتحويل النص إلى كلام. يشير النموذج أيضًا إلى الدالة setTts، وهي دالة جديدة توفّر معلومات "تحويل النص إلى كلام" (TTS) لمثيل الأداة.

  1. أضف دالة setTts الجديدة هذه إلى StatsWidget.kt باستخدام الرمز التالي:
    // 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)
    }
    

وأخيرًا، أكمل منطق تحويل النص إلى كلام من خلال ضبط معلومات تقنية تحويل النص إلى كلام عندما تقوم قاعدة بيانات التمارين بإرجاع بيانات فارغة لنوع التمرين المطلوب.

  1. عدِّل الدالة setNoActivityDataWidget() في StatsWidget.kt باستخدام الرمز التالي:
    // 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)
      }
    }
    

6- اختبار إجراء التطبيق

أثناء مرحلة التطوير، يمكنك استخدام مكوّن "مساعد Google" الإضافي لمعاينة "الإجراءات في تطبيق "مساعد Google" على جهاز اختبار. ويمكنك تعديل معلَمات intent لإجراء تطبيق باستخدام الأداة لاختبار طريقة تعامل هذا الإجراء مع الطرق المختلفة التي قد يطلب المستخدم من "مساعد Google" تنفيذها.

إنشاء معاينة

لاختبار إجراء التطبيق باستخدام المكوّن الإضافي:

  1. انتقِل إلى الأدوات > مساعد Google > أداة اختبار "الإجراءات في التطبيق" قد يُطلب منك تسجيل الدخول إلى "استوديو Android" باستخدام حسابك على Google.
  2. انقر على إنشاء معاينة. راجِع سياسات خدمة "مهامّ في التطبيقات" وبنود الخدمة واقبلها إذا طُلِب منك ذلك.

اختبار نوع تمرين متوقع

عرض أداة تعرض معلومات عن آخر عملية تشغيل مكتملة في التطبيق باتباع الخطوات التالية في أداة الاختبار:

  1. في الخطوة الأولى حيث تطلب منك الأداة اختيار ملف BII وضبطه، اختَر actions.intent.GET_EXERCISE_OBSERVATION.
  2. في مربّع exerciseObservation، عدِّل اسم التمرين التلقائي من climbing إلى run.
  3. انقر على تشغيل إجراء على التطبيق.

شاشة تعرض تطبيقًا مصغّرًا يظهر باستخدام مكوّن &quot;مساعد Google&quot; الإضافي.

اختبار نوع تمرين غير متوقَّع

لاختبار نوع تمرين غير متوقع في أداة الاختبار:

  1. في مربع exerciseObservation، عدِّل قيمة name من Run إلى Climbing.
  2. انقر على تشغيل إجراء على التطبيق.

من المفترض أن يعرض "مساعد Google" تطبيقًا مصغّرًا يعرض الرسالة "لم يتم العثور على أي نشاط". المعلومات.

شاشة تعرض تطبيقًا مصغّرًا بدون معلومات التمارين الرياضية باستخدام مكوّن &quot;مساعد Google&quot; الإضافي.

اختبار الإجراء الاحتياطي

يجب أن تؤدي طلبات البحث التي تؤدي إلى الغرض الاحتياطي إلى عرض أداة تعرض معلومات حول آخر نشاط تم تسجيله من أي نوع تمرين.

لاختبار الغرض الاحتياطي:

  1. في مربع exerciseObservation، احذف عنصر aboutExercise.
  2. انقر على تشغيل إجراء على التطبيق.

من المفترض أن يعرض "مساعد Google" تطبيقًا مصغّرًا يعرض معلومات عن آخر تمرين مكتمل.

شاشة تعرض تطبيق مصغّر يعرض آخر نشاط مسجَّل باستخدام مكوّن &quot;مساعد Google&quot; الإضافي.

7. الخطوات التالية

تهانينا!

لديك الآن القدرة على تلبية احتياجات المستخدمين باستخدام أداة Android المصغّرة مع "مساعد Google".

المواضيع التي تناولناها

في هذا الدرس التطبيقي حول الترميز، تعلمتَ كيفية:

  • إضافة تطبيق مصغّر إلى BII.
  • عدِّل أداة للوصول إلى المعلمات من Android Extras.

الخطوات التالية

ومن هنا، يمكنك محاولة إجراء مزيد من التحسينات على تطبيق اللياقة البدنية. للرجوع إلى المشروع النهائي، يُرجى الاطّلاع على المستودع الرئيسي على GitHub.

في ما يلي بعض الاقتراحات لمزيد من المعلومات حول توسيع نطاق هذا التطبيق باستخدام ميزة "مهامّ في التطبيقات":

  • انتقِل إلى مرجع الأهداف المضمّنة في "مهامّ في التطبيقات" للاطّلاع على مزيد من الطرق لتوسيع نطاق وصول تطبيقاتك إلى "مساعد Google".

لمواصلة رحلتك في "المهام مع مساعد Google"، يُرجى الاطّلاع على المراجع التالية:

يمكنك متابعتنا على Twitter @ActionsOnGoogle لمعرفة آخر الأخبار، كما يمكنك نشر تغريدة على #appactions لمشاركة ما أنجزته.

استطلاع لجمع الملاحظات

أخيرًا، يُرجى ملء هذا الاستطلاع لتقديم ملاحظاتك حول تجربتك في هذا الدرس التطبيقي.