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

1. ภาพรวม

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

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

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

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

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

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

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

โปรดตรวจสอบว่าสภาพแวดล้อมในการพัฒนาพร้อมสำหรับการพัฒนา App Actions ก่อนดำเนินการต่อ โดยควรมีลักษณะดังนี้

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

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

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

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

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

แผนภาพต่อไปนี้แสดงขั้นตอนการทำงานนี้

แผนภาพลำดับงานที่แสดงการดำเนินการตามคำสั่งของวิดเจ็ต Assistant

วิดเจ็ต FitActions

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

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

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

ในโค้ดแล็บนี้ คุณจะอัปเดตแอปตัวอย่างเพื่อจัดการฟังก์ชันการทำงานของ App Actions การเปลี่ยนแปลงต่างๆ มีดังนี้

  1. การกำหนดค่าความสามารถ GET_EXERCISE_OBSERVATION BII เพื่อแสดงผลอินสแตนซ์ของออบเจ็กต์ StatsWidget
  2. การอัปเดตคลาส StatsWidget เพื่อใช้ฟีเจอร์ App Actions เช่น
    • การใช้พารามิเตอร์ 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 ช่วยให้คุณทดสอบ App Actions ในอุปกรณ์ทดสอบได้ โดยจะทำงานด้วยการส่งข้อมูลไปยัง 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. เพิ่ม App Action

ในขั้นตอนนี้ คุณจะเพิ่มความสามารถ 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 กับเจตนา 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>
    

เพิ่มความตั้งใจสำรอง

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

  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>
    

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

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

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

เพิ่มไลบรารีส่วนขยายวิดเจ็ต

คลังส่วนขยายวิดเจ็ตของ 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เปลี่ยนแปลงทุกครั้งจะช่วยหลีกเลี่ยงข้อผิดพลาดเมื่อสร้างแอป

เพิ่มบริการวิดเจ็ต

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

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

ตอนนี้คลาส StatsWidget สามารถประมวลผลข้อมูล Intent ของ Android สำหรับ App Actions ที่เข้ามาได้แล้ว ให้อัปเดตตรรกะของขั้นตอนการสร้างวิดเจ็ตเพื่อตรวจสอบว่า App Action เป็นตัวเรียกใช้วิดเจ็ตหรือไม่

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

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

เปิดใช้ TTS

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

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

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

วิธีทดสอบ App Actions ด้วยปลั๊กอิน

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

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

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

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

หน้าจอแสดงวิดเจ็ตที่ส่งคืนโดยใช้ปลั๊กอิน Google Assistant

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

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

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

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

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

ทดสอบเจตนาสำรอง

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

วิธีทดสอบเจตนาสำรอง

  1. ในช่อง exerciseObservation ให้ลบออบเจ็กต์ aboutExercise
  2. คลิกเรียกใช้ App Action

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

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

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

ยินดีด้วย

ตอนนี้คุณสามารถตอบคำค้นหาของผู้ใช้ได้โดยใช้วิดเจ็ต Android กับ Assistant

สิ่งที่เราได้พูดถึงไปแล้ว

ในโค้ดแล็บนี้ คุณได้เรียนรู้วิธีทำสิ่งต่อไปนี้

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

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

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

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

หากต้องการเดินทางต่อใน Actions on Google โปรดดูแหล่งข้อมูลต่อไปนี้

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

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

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