ผสานรวมวิดเจ็ต Android กับ Google Assistant

1. ภาพรวม

ใน Codelab การดำเนินการของแอปเวอร์ชันแรก คุณได้เรียนรู้วิธีขยาย Google Assistant ให้ไปใช้แอปฟิตเนสตัวอย่างด้วยการใช้ Intent ในตัว (BII) จากหมวดหมู่สุขภาพและการออกกำลังกาย BII

การดำเนินการของแอปช่วยให้ผู้ใช้เรียกใช้ฟีเจอร์ของแอปที่ต้องการจาก Assistant ได้โดยตรงด้วยการถามสิ่งต่างๆ อย่างเช่น "Ok Google เริ่มเรียกใช้ใน ExampleApp" นอกจากการเปิดตัวแอปแล้ว Assistant สามารถแสดงวิดเจ็ต Android แบบอินเทอร์แอกทีฟให้แก่ผู้ใช้เพื่อดำเนินการตามคำขอสำหรับ BII ที่มีสิทธิ์

หน้าจอแสดง Assistant ที่แสดงวิดเจ็ตกลับมาเพื่อตอบสนองต่อ\nคำถามของผู้ใช้ที่ทริกเกอร์ความสามารถ GET_EXERCISE_OBSERVATION BII ของแอป

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีแสดงผลวิดเจ็ต Android เพื่อดำเนินการตามคำขอของผู้ใช้ Assistant และคุณยังเรียนรู้ที่จะ:

  • พารามิเตอร์ BII เพื่อปรับเปลี่ยนวิดเจ็ตในแบบของคุณ
  • แนะนำการอ่านออกเสียงข้อความ (TTS) ใน Assistant สำหรับวิดเจ็ต
  • ใช้การอ้างอิง Intent ในตัวเพื่อระบุการเติมวิดเจ็ตรองรับ BII ใด

ข้อกำหนดเบื้องต้น

ก่อนดำเนินการต่อ โปรดตรวจสอบว่าสภาพแวดล้อมการพัฒนาของคุณพร้อมสำหรับการพัฒนาการดำเนินการของแอปแล้ว ควรมีสิ่งต่อไปนี้

  • เทอร์มินัลสำหรับเรียกใช้คำสั่ง Shell ซึ่งมีการติดตั้ง git
  • Android Studio เวอร์ชันเสถียรล่าสุด
  • อุปกรณ์ Android จริงหรือเสมือนที่มีการเข้าถึงอินเทอร์เน็ต
  • บัญชี Google ที่ลงชื่อเข้าใช้ Android Studio, แอป Google และแอป Google Assistant

หากคุณใช้อุปกรณ์จริง ให้เชื่อมต่ออุปกรณ์กับเครื่องสำหรับการพัฒนาภายใน

2. ทำความเข้าใจวิธีการทำงาน

Google Assistant ใช้การทำความเข้าใจภาษาธรรมชาติ (NLU) เพื่ออ่านคำขอของผู้ใช้และจับคู่กับ Intent ในตัวของ Assistant (BII) จากนั้น Assistant จะแมป Intent กับความสามารถ (ที่ใช้ BII) ที่คุณลงทะเบียนสำหรับ Intent ดังกล่าวในแอป และสุดท้าย Assistant จะดําเนินการตามคําขอของผู้ใช้ด้วยการแสดงวิดเจ็ต Android ที่แอปสร้างขึ้นโดยใช้รายละเอียดที่พบในความสามารถ

ใน Codelab นี้ คุณจะกำหนดความสามารถที่ลงทะเบียนการรองรับ GET_EXERCISE_OBSERVATION BII วิธีนี้เป็นการสั่งให้ Assistant สร้าง Intent ของ Android ให้กับคลาสวิดเจ็ต FitActions เพื่อดำเนินการตามคำขอสำหรับ BII นี้ คุณอัปเดตชั้นเรียนนี้เพื่อสร้างวิดเจ็ตที่ปรับเปลี่ยนในแบบของคุณสำหรับ Assistant ไว้แสดงต่อผู้ใช้ และการแนะนำ TTS สำหรับ Assistant เพื่อประกาศ

แผนภาพต่อไปนี้จะแสดงขั้นตอนนี้

แผนผังแสดงการดำเนินการเต็มรูปแบบของวิดเจ็ต Assistant

วิดเจ็ต FitActions

แอป FitActions ตัวอย่างมีวิดเจ็ตข้อมูลการออกกำลังกายที่ผู้ใช้สามารถเพิ่มลงในหน้าจอหลักได้ วิดเจ็ตนี้เหมาะอย่างยิ่งสำหรับใช้ตอบคำค้นหาของผู้ใช้ที่ทริกเกอร์ GET_EXERCISE_OBSERVATION BII

วิธีการทำงานของวิดเจ็ต

เมื่อผู้ใช้เพิ่มวิดเจ็ตในหน้าจอหลัก วิดเจ็ตจะใช้คำสั่ง ping กับเครื่องรับสัญญาณประกาศของอุปกรณ์ บริการนี้เรียกดูข้อมูลเกี่ยวกับวิดเจ็ตจากคำจำกัดความตัวรับวิดเจ็ตในทรัพยากร 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()

เพิ่มการสนับสนุน Assistant

ใน Codelab นี้ คุณจะได้อัปเดตแอปตัวอย่างเพื่อจัดการฟังก์ชันการดำเนินการของแอป การเปลี่ยนแปลงเหล่านี้ประกอบด้วย

  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 Studio

  1. คลิกนำเข้าโปรเจ็กต์ในกล่องโต้ตอบยินดีต้อนรับสู่ Android Studio
  2. ค้นหาและเลือกโฟลเดอร์ที่คุณโคลนที่เก็บ

หากต้องการดูเวอร์ชันของแอปที่แสดงถึง Codelab ที่สมบูรณ์ ให้โคลนที่เก็บของแอปตัวอย่างโดยใช้แฟล็ก --branch master

อัปเดตรหัสแอปพลิเคชัน Android

การอัปเดตรหัสแอปพลิเคชันของแอปจะระบุแอปบนอุปกรณ์ทดสอบโดยไม่ซ้ำกัน และหลีกเลี่ยงไม่ให้มี "ชื่อแพ็กเกจซ้ำ" หากอัปโหลดแอปไปยัง Play Console หากต้องการอัปเดตรหัสแอปพลิเคชัน ให้เปิด app/build.gradle:

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

แทนที่ "MYUNIQUENAME" ในช่อง applicationId เพื่อนำเสนอข้อมูลเฉพาะสำหรับคุณ

ติดตั้งปลั๊กอินทดสอบ

ปลั๊กอิน Google Assistant ให้คุณทดสอบการดำเนินการของแอปในอุปกรณ์ทดสอบ โดยจะทำงานโดยส่งข้อมูลไปยัง Assistant ผ่านแอป Google ในอุปกรณ์ Android หากยังไม่มี ให้ติดตั้งโดยทำตามขั้นตอนต่อไปนี้

  1. ไปที่ไฟล์ > การตั้งค่า (Android Studio > ค่ากำหนดบน MacOS)
  2. ในส่วนปลั๊กอิน ให้ไปที่ Marketplace และค้นหา "Google Assistant" นอกจากนี้ คุณยังดาวน์โหลดและติดตั้งเครื่องมือทดสอบด้วยตนเองได้ด้วย
  3. ติดตั้งเครื่องมือและรีสตาร์ท Android Studio

ทดสอบแอปในอุปกรณ์

ก่อนที่จะทำการเปลี่ยนแปลงเพิ่มเติมกับแอป คุณควรทราบถึงสิ่งที่แอปตัวอย่างสามารถทำอะไรได้บ้าง

เรียกใช้แอปในอุปกรณ์ทดสอบ ดังนี้

  1. ใน Android Studio ให้เลือกอุปกรณ์จริงหรืออุปกรณ์เสมือน แล้วเลือกเรียกใช้ > เรียกใช้แอป หรือคลิกเรียกใช้เรียกใช้ไอคอนแอปใน Android Studioในแถบเครื่องมือ
  2. กดปุ่มหน้าแรกค้างไว้เพื่อตั้งค่า Assistant และยืนยันว่าใช้งานได้ คุณจะต้องลงชื่อเข้าใช้ Assistant ในอุปกรณ์ หากยังไม่ได้ดำเนินการ

ดูข้อมูลเพิ่มเติมเกี่ยวกับอุปกรณ์เสมือนของ Android ได้ที่สร้างและจัดการอุปกรณ์เสมือน

สำรวจแอปคร่าวๆ เพื่อดูว่าแอปทำอะไรได้บ้าง แอปจะป้อนข้อมูลกิจกรรมการออกกำลังกาย 10 รายการล่วงหน้าและแสดงข้อมูลนี้ในมุมมองแรก

ลองใช้วิดเจ็ตที่มีอยู่

  1. แตะปุ่มหน้าแรกเพื่อไปที่หน้าจอหลักของอุปกรณ์ทดสอบ
  2. กดพื้นที่ว่างในหน้าจอหลักค้างไว้แล้วเลือกวิดเจ็ต
  3. เลื่อนรายการวิดเจ็ตลงมาที่ FitActions
  4. กดไอคอน FitActions ค้างไว้ แล้ววางวิดเจ็ตของไอคอนนั้นบนหน้าจอหลัก

ภาพหน้าจอแสดงวิดเจ็ต FitActions บนหน้าจอหลักของอุปกรณ์

4. เพิ่มการดำเนินการของแอป

ในขั้นตอนนี้ ให้เพิ่มความสามารถ GET_EXERCISE_OBSERVATION BII ซึ่งทำได้โดยเพิ่มองค์ประกอบ capability ใหม่ใน shortcuts.xml โดยความสามารถนี้จะระบุวิธีทริกเกอร์ความสามารถ วิธีใช้พารามิเตอร์ BII และ Intent ของ 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>
    
    แทนที่ค่า android:targetPackage PUT_YOUR_APPLICATION_ID_HERE ด้วย applicationId ที่ไม่ซ้ำกัน

ความสามารถนี้จะแมป GET_EXERCISE_OBSERVATION BII กับ Intent ของ app-widget เพื่อที่ว่าเมื่อมีการทริกเกอร์ BII วิดเจ็ตจะสร้างอินสแตนซ์และแสดงต่อผู้ใช้

ก่อนเรียกใช้วิดเจ็ต Assistant จะดึงข้อมูลพารามิเตอร์ BII ที่รองรับออกจากคําค้นหาของผู้ใช้ Codelab นี้ต้องใช้พารามิเตอร์ BII exerciseObservation.aboutExercise.name ซึ่งแสดงถึงประเภทการออกกำลังกายที่ผู้ใช้ขอ แอปนี้รองรับการออกกำลังกาย 3 ประเภท ได้แก่ "การวิ่ง" "การเดิน" และ "การปั่นจักรยาน" คุณระบุพื้นที่โฆษณาในบรรทัดเพื่อแจ้งให้ Assistant ทราบเกี่ยวกับค่าที่รองรับเหล่านี้

  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>
    

เพิ่ม Intent สำรอง

Intent สำรองจะจัดการกับสถานการณ์ที่การค้นหาของผู้ใช้ไม่สามารถตอบสนองได้ เนื่องจากการค้นหาไม่มีพารามิเตอร์ที่จำเป็นสำหรับความสามารถนี้ ความสามารถ GET_EXERCISE_OBSERVATION ต้องใช้พารามิเตอร์ exerciseObservation.aboutExercise.name ซึ่งระบุโดยแอตทริบิวต์ android:required="true" ในสถานการณ์เช่นนี้ Assistant กําหนดให้คุณกําหนด Intent สำรองเพื่อให้คำขอดำเนินการได้สำเร็จ แม้ว่าจะไม่มีการระบุพารามิเตอร์ในการค้นหาก็ตาม

  1. ใน shortcuts.xml ให้เพิ่ม Intent สำรองไปยังความสามารถของ 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>
    

ในการกำหนดค่าตัวอย่างนี้ Fulfillment สำรองคือ Intent ของ Android ที่ไม่มีพารามิเตอร์ในข้อมูล Extra

5. เปิดใช้วิดเจ็ตสำหรับ Assistant

เมื่อเปิดความสามารถของ GET_EXERCISE_OBSERVATION แล้ว ให้อัปเดตคลาสวิดเจ็ตเพื่อรองรับการเรียกใช้การสั่งงานด้วยเสียงของแอป

เพิ่มไลบรารีส่วนขยายของ Widgets

ไลบรารีส่วนขยายวิดเจ็ตของ App Actions ช่วยเพิ่มประสิทธิภาพวิดเจ็ตสำหรับประสบการณ์การใช้งาน Assistant ด้วยเสียง กล่าวอย่างเจาะจงคือ ช่วยให้คุณสามารถให้การแนะนำ TTS ที่กำหนดเองสำหรับวิดเจ็ตของคุณ

  1. เพิ่มทรัพยากร Dependency ของไลบรารีส่วนขยายวิดเจ็ตลงในทรัพยากร /app/build.gradle ของแอปตัวอย่าง:
    // app/build.gradle
    
    dependencies {
      //...
      implementation "com.google.assistant.appactions:widgets:0.0.1"
    }
    
    คลิกซิงค์ตอนนี้ในช่องคำเตือนที่ปรากฏใน Android Studio การซิงค์หลังจากเปลี่ยน 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>
    
    

Assistant จะใช้บริการนี้เพื่อส่งคําขอไปยังแอปในระหว่างการค้นหาด้วยเสียงที่เรียกใช้การดำเนินการตามวิดเจ็ต บริการจะได้รับคำขอพร้อมกับข้อมูล BII บริการใช้ข้อมูลนี้เพื่อสร้างออบเจ็กต์วิดเจ็ต RemoteView เพื่อแสดงผลภายใน Assistant

อัปเดตคลาสวิดเจ็ต

กำหนดค่าแอปให้กำหนดเส้นทางคำขอความสามารถ GET_EXERCISE_OBSERVATION ไปยังคลาสวิดเจ็ตแล้ว จากนั้นอัปเดตคลาส StatsWidget.kt เพื่อสร้างอินสแตนซ์วิดเจ็ตที่ปรับให้เหมาะกับคำขอของผู้ใช้ โดยใช้ค่าพารามิเตอร์ BII

  1. เปิดชั้นเรียน StatsWidget.kt และนำเข้าไลบรารีส่วนขยายของวิดเจ็ต App Actions:
    // 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 เพื่อให้ชั้นเรียนใช้ข้อมูลตัวเลือกวิดเจ็ตที่ส่งจาก Assistant ดังนี้
    // 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 ตอบสนองต่อ Intent ของ Android ที่สร้างโดยความสามารถของ GET_EXERCISE_OBSERVATION ได้อย่างไร

  • optionsBundle = แพ็กเกจ
    • กลุ่มคือออบเจ็กต์ที่มีจุดประสงค์เพื่อใช้ข้ามขอบเขตของกระบวนการ ระหว่างกิจกรรมที่มี Intent และเพื่อเก็บสถานะชั่วคราวในการเปลี่ยนแปลงการกำหนดค่า Assistant ใช้ออบเจ็กต์ Bundle รายการเพื่อส่งข้อมูลการกำหนดค่าไปยังวิดเจ็ต
  • bii = actions.intent.GET_EXERCISE_OBSERVATION
    • ชื่อของ BII มีอยู่ในแพ็กเกจโดยใช้ AppActionsWidgetExtension
  • hasBii = true
    • ตรวจสอบว่ามี BII หรือไม่
  • params = Bundle[{aboutExerciseName=running}]
    • Bundle พิเศษที่สร้างโดย App Actions ฝังอยู่ในตัวเลือกวิดเจ็ต Bundle ซึ่งมีคู่คีย์/ค่าของ BII ในกรณีนี้ ค่า running ได้มาจากข้อความค้นหาตัวอย่าง "Ok Google แสดงสถิติการวิ่งของฉันใน ExampleApp"
  • isFallbackIntent = false
    • ตรวจหาพารามิเตอร์ BII ที่จําเป็นใน Intent Extras
  • aboutExerciseName = running
    • ดึงค่า Intent Extras ของ aboutExerciseName
  • exerciseType = RUNNING
    • ใช้ aboutExerciseName เพื่อค้นหาออบเจ็กต์ประเภทฐานข้อมูลที่สอดคล้องกัน

เมื่อคลาส StatsWidget ประมวลผลข้อมูล Intent ของการดำเนินการของแอป 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 ที่ส่งผ่าน Intent ของการดำเนินการของแอป 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()
           }
       }
    }
    
    

ในโค้ดก่อนหน้านี้ ให้ใช้คลาส repository ที่มีอยู่ในแอปเพื่อเรียกข้อมูลการออกกำลังกายจากฐานข้อมูลในเครื่องของแอป คลาสนี้จะมี API ที่ช่วยให้เข้าถึงฐานข้อมูลได้ง่ายขึ้น ที่เก็บจะทำงานโดยการเปิดเผยออบเจ็กต์ LiveData เมื่อดำเนินการค้นหาในฐานข้อมูล ในโค้ด คุณสังเกตเห็น LiveData นี้เพื่อดึงข้อมูลกิจกรรมการออกกำลังกายล่าสุด

เปิดใช้ TTS

คุณระบุสตริง TTS เพื่อให้ Assistant ประกาศเมื่อแสดงวิดเจ็ตได้ เราขอแนะนำให้รวมส่วนนี้ด้วยเพื่อให้วิดเจ็ตมีเสียงประกอบ ฟังก์ชันนี้มาจากไลบรารีส่วนขยายวิดเจ็ตของ App Actions ซึ่งจะช่วยให้คุณตั้งค่าข้อความและการแนะนำ TTS ที่มาพร้อมกับวิดเจ็ตใน Assistant ได้

ส่วนที่เหมาะแก่การแนะนำ 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)
          }
    }
    
    

โค้ดที่อยู่ก่อนหน้าอ้างอิงทรัพยากรสตริง 2 รายการ รายการหนึ่งสำหรับเสียงพูด และอีกรายการสำหรับข้อความ ดูส่วนการแนะนำสไตล์การอ่านออกเสียงข้อความของวิดีโอวิดเจ็ตสำหรับการแนะนำ TTS ตัวอย่างนี้ยังอ้างถึง 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)
    }
    

สุดท้าย กรอกตรรกะ TTS โดยการตั้งค่าข้อมูล TTS เมื่อฐานข้อมูลการออกกำลังกายแสดงผลข้อมูลที่ว่างเปล่าสำหรับประเภทการออกกำลังกายที่ขอ

  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 Assistant เพื่อดูตัวอย่างการดำเนินการของแอป Assistant ในอุปกรณ์ทดสอบ คุณปรับพารามิเตอร์ Intent ของการดำเนินการของแอปได้ด้วยเครื่องมือเพื่อทดสอบวิธีที่การดำเนินการของคุณจัดการกับวิธีต่างๆ ที่ผู้ใช้อาจขอให้ Assistant เรียกใช้การดำเนินการดังกล่าว

สร้างตัวอย่างเพลง

วิธีทดสอบการดำเนินการของแอปด้วยปลั๊กอิน

  1. ไปที่เครื่องมือ > Google Assistant > เครื่องมือทดสอบการดำเนินการของแอป ระบบอาจขอให้คุณลงชื่อเข้าใช้ Android Studio โดยใช้บัญชี Google
  2. คลิกสร้างพรีวิว หากระบบถาม ให้อ่านและยอมรับนโยบายและข้อกำหนดในการให้บริการของการดำเนินการของแอป

ทดสอบประเภทการออกกำลังกายที่คาดไว้

แสดงวิดเจ็ตที่แสดงข้อมูลเกี่ยวกับการเรียกใช้ครั้งสุดท้ายที่ดำเนินการในแอปเสร็จสิ้นโดยทำตามขั้นตอนเหล่านี้ในเครื่องมือทดสอบ

  1. ในขั้นตอนแรกที่เครื่องมือจะขอให้คุณเลือกและกำหนดค่า BII ให้เลือก actions.intent.GET_EXERCISE_OBSERVATION
  2. ในช่อง exerciseObservation ให้อัปเดตชื่อการออกกำลังกายเริ่มต้นจาก climbing เป็น run
  3. คลิกเรียกใช้การดำเนินการของแอป

หน้าจอแสดงวิดเจ็ตที่แสดงผลผ่านปลั๊กอิน Google Assistant

ทดสอบประเภทการออกกำลังกายที่ไม่คาดคิด

วิธีทดสอบประเภทการออกกำลังกายที่ไม่คาดคิดในเครื่องมือทดสอบ

  1. ในช่อง exerciseObservation ให้อัปเดตค่า name จาก Run เป็น Climbing
  2. คลิกเรียกใช้การดำเนินการของแอป

Assistant ควรคืนวิดเจ็ตที่แสดงข้อความ "ไม่พบกิจกรรม"

หน้าจอแสดงวิดเจ็ตที่ไม่มีข้อมูลการออกกำลังกายกลับมาโดยใช้ปลั๊กอิน Google Assistant

ทดสอบ Intent สำรอง

คำค้นหาที่ทริกเกอร์ Intent สำรองควรแสดงผลวิดเจ็ตที่แสดงข้อมูลเกี่ยวกับกิจกรรมที่บันทึกไว้ล่าสุดสำหรับการออกกำลังกายทุกประเภท

วิธีทดสอบ Intent สำรอง

  1. ในช่อง exerciseObservation ให้ลบออบเจ็กต์ aboutExercise
  2. คลิกเรียกใช้การดำเนินการของแอป

Assistant ควรจะแสดงวิดเจ็ตที่แสดงข้อมูลการออกกำลังกายครั้งล่าสุด

หน้าจอแสดงวิดเจ็ตที่แสดงกิจกรรมที่บันทึกไว้ล่าสุดโดยใช้ปลั๊กอิน Google Assistant

7. ขั้นตอนถัดไป

ยินดีด้วย

ตอนนี้คุณสามารถดำเนินการตามผู้ใช้ โดยใช้วิดเจ็ต Android ที่มี Assistant

สรุปประเด็นที่ได้พูดถึง

คุณได้เรียนรู้วิธีต่อไปนี้ใน Codelab แล้ว

  • เพิ่มวิดเจ็ตแอปลงใน BII
  • แก้ไขวิดเจ็ตเพื่อเข้าถึงพารามิเตอร์จาก Android Extras

ขั้นตอนถัดไป

จากที่นี่ คุณสามารถลองปรับแต่งแอปฟิตเนสเพิ่มเติมได้ หากต้องการอ้างอิงโปรเจ็กต์ที่เสร็จสมบูรณ์แล้ว ให้ดูที่เก็บหลักใน GitHub

ต่อไปนี้คือคำแนะนำบางส่วนสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการขยายแอปนี้ด้วยการดำเนินการของแอป

โปรดสำรวจแหล่งข้อมูลเหล่านี้เพื่อดำเนินการต่อในเส้นทางของ Actions on Google

ติดตามเราบน Twitter @ActionsOnGoogle เพื่อติดตามประกาศล่าสุดของเรา และทวีตไปที่ #appactions เพื่อแชร์สิ่งที่คุณสร้างขึ้น

แบบสำรวจความคิดเห็น

สุดท้าย โปรดกรอกข้อมูลในแบบสำรวจนี้เพื่อแสดงความคิดเห็นเกี่ยวกับประสบการณ์การใช้งาน Codelab นี้