1. ภาพรวม
ในCodelab ของ App Actions ครั้งแรก คุณได้เรียนรู้วิธีขยาย Google Assistant ไปยังแอปฟิตเนสตัวอย่างโดยการใช้Intent ในตัว (BII) จากหมวดหมู่ BII ด้านสุขภาพและฟิตเนส
App Actions ช่วยให้ผู้ใช้เปิดใช้ฟีเจอร์ที่เฉพาะเจาะจงของแอปได้โดยตรงจาก Assistant ด้วยการถามคำสั่งต่างๆ เช่น "Ok Google เริ่มวิ่งใน ExampleApp" นอกเหนือจากการเปิดแอปแล้ว Assistant ยังแสดงวิดเจ็ต Android แบบอินเทอร์แอกทีฟต่อผู้ใช้เพื่อตอบสนองคำขอสำหรับ 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 เพื่อประกาศ
แผนภาพต่อไปนี้แสดงขั้นตอนการทำงานนี้

วิดเจ็ต 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 การเปลี่ยนแปลงต่างๆ มีดังนี้
- การกำหนดค่าความสามารถ
GET_EXERCISE_OBSERVATIONBII เพื่อแสดงผลอินสแตนซ์ของออบเจ็กต์StatsWidget - การอัปเดตคลาส
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
- ในกล่องโต้ตอบยินดีต้อนรับสู่ Android Studio ให้คลิกนำเข้าโปรเจ็กต์
- ค้นหาและเลือกโฟลเดอร์ที่คุณโคลนที่เก็บ
หากต้องการดูแอปเวอร์ชันที่แสดงถึง 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 หากยังไม่มีปลั๊กอิน ให้ติดตั้งโดยทำตามขั้นตอนต่อไปนี้
- ไปที่ไฟล์ > การตั้งค่า (Android Studio > ค่ากำหนดใน MacOS)
- ในส่วนปลั๊กอิน ให้ไปที่ Marketplace แล้วค้นหา "Google Assistant" นอกจากนี้ คุณยังดาวน์โหลดและติดตั้งเครื่องมือทดสอบด้วยตนเองได้ด้วย
- ติดตั้งเครื่องมือแล้วรีสตาร์ท Android Studio
ทดสอบแอปบนอุปกรณ์
ก่อนทำการเปลี่ยนแปลงเพิ่มเติมในแอป การทำความเข้าใจสิ่งที่แอปตัวอย่างทำได้จะช่วยให้คุณเห็นภาพรวมได้
เรียกใช้แอปในอุปกรณ์ทดสอบโดยทำดังนี้
- ใน Android Studio ให้เลือกอุปกรณ์จริงหรืออุปกรณ์เสมือน แล้วเลือกเรียกใช้ > เรียกใช้แอป หรือคลิกเรียกใช้
ในแถบเครื่องมือ - กดปุ่มหน้าแรกค้างไว้เพื่อตั้งค่า Assistant และตรวจสอบว่าใช้งานได้ คุณจะต้องลงชื่อเข้าใช้ Assistant ในอุปกรณ์ หากยังไม่ได้ทำ
ดูข้อมูลเพิ่มเติมเกี่ยวกับอุปกรณ์เสมือน Android ได้ที่หัวข้อสร้างและจัดการอุปกรณ์เสมือน
ลองสำรวจแอปคร่าวๆ เพื่อดูว่าแอปทำอะไรได้บ้าง แอปจะป้อนข้อมูลกิจกรรมการออกกำลังกาย 10 รายการล่วงหน้าและแสดงข้อมูลนี้ในมุมมองแรก
ลองใช้วิดเจ็ตที่มีอยู่
- แตะปุ่มหน้าแรกเพื่อไปที่หน้าจอหลักของอุปกรณ์ทดสอบ
- กดพื้นที่ว่างในหน้าจอหลักค้างไว้ แล้วเลือกวิดเจ็ต
- เลื่อนรายการวิดเจ็ตลงไปที่ FitActions
- กดไอคอน FitActions ค้างไว้แล้ววางวิดเจ็ตไว้บนหน้าจอหลัก

4. เพิ่ม App Action
ในขั้นตอนนี้ คุณจะเพิ่มความสามารถ GET_EXERCISE_OBSERVATION BII โดยทำได้ด้วยการเพิ่มcapabilityองค์ประกอบใหม่ใน shortcuts.xml ความสามารถนี้จะระบุวิธีทริกเกอร์ความสามารถ วิธีใช้พารามิเตอร์ BII และ Intent ของ Android ที่จะเรียกใช้เพื่อดำเนินการตามคำขอ
- เพิ่มองค์ประกอบ
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 ทราบถึงค่าที่รองรับเหล่านี้
- กำหนดองค์ประกอบพื้นที่โฆษณาเหล่านี้โดยเพิ่มการกำหนดค่านี้เหนือความสามารถ
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 จะกำหนดให้คุณกำหนดเจตนาสำรองเพื่อให้คำขอสำเร็จ แม้ว่าจะไม่มีพารามิเตอร์ในคำค้นหาก็ตาม
- ใน
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 ที่กำหนดเองสำหรับวิดเจ็ตได้
- เพิ่มทรัพยากร Dependency ของไลบรารีส่วนขยายวิดเจ็ตลงในแอปตัวอย่าง
/app/build.gradleดังนี้ คลิกซิงค์เลยในกล่องคำเตือนที่ปรากฏใน Android Studio การซิงค์หลังจากการ// app/build.gradle dependencies { //... implementation "com.google.assistant.appactions:widgets:0.0.1" }build.gradleเปลี่ยนแปลงทุกครั้งจะช่วยหลีกเลี่ยงข้อผิดพลาดเมื่อสร้างแอป
เพิ่มบริการวิดเจ็ต
Service คือคอมโพเนนต์ของแอปพลิเคชันที่สามารถดำเนินการที่ใช้เวลานานในเบื้องหลังได้ แอปของคุณต้องให้บริการเพื่อประมวลผลคำขอวิดเจ็ต
- เพิ่มบริการลงในทรัพยากร
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
- เปิด
StatsWidget.ktคลาสแล้วนำเข้าไลบรารีส่วนขยายวิดเจ็ตการกระทำของแอปโดยทำดังนี้// StatsWidget.kt // ... Other import statements import com.google.assistant.appactions.widgets.AppActionsWidgetExtension - เพิ่มตัวแปรส่วนตัวต่อไปนี้ ซึ่งคุณใช้เมื่อพิจารณาข้อมูลที่ควรป้อนในวิดเจ็ต
// StatsWidget.kt private val hasBii: Boolean private val isFallbackIntent: Boolean private val aboutExerciseName: String private val exerciseType: FitActivity.Type - เพิ่มฟังก์ชัน
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เพื่อส่งข้อมูลการกำหนดค่าไปยังวิดเจ็ต
- Bundle คือออบเจ็กต์ที่ตั้งใจให้ใช้ข้ามขอบเขตของกระบวนการ ระหว่างกิจกรรมที่มี Intent และเพื่อจัดเก็บสถานะชั่วคราวเมื่อมีการเปลี่ยนแปลงการกำหนดค่า Assistant ใช้ออบเจ็กต์
bii=actions.intent.GET_EXERCISE_OBSERVATION- ชื่อของ BII จะพร้อมใช้งานจาก Bundle โดยใช้
AppActionsWidgetExtension
- ชื่อของ BII จะพร้อมใช้งานจาก Bundle โดยใช้
hasBii=true- ตรวจสอบว่ามี BII หรือไม่
params=Bundle[{aboutExerciseName=running}]- ระบบจะซ้อน Bundle พิเศษที่สร้างโดย App Actions ไว้ในตัวเลือกวิดเจ็ต
Bundleซึ่งมีคู่คีย์/ค่าของ BII ในกรณีนี้ ระบบจะดึงค่าrunningจากคำค้นหาตัวอย่าง "Ok Google แสดงสถิติการวิ่งของฉันใน ExampleApp หน่อย"
- ระบบจะซ้อน Bundle พิเศษที่สร้างโดย App Actions ไว้ในตัวเลือกวิดเจ็ต
isFallbackIntent=false- ตรวจสอบว่ามีพารามิเตอร์ BII ที่จำเป็นใน Intent
Extrasหรือไม่
- ตรวจสอบว่ามีพารามิเตอร์ BII ที่จำเป็นใน Intent
aboutExerciseName=running- รับค่าความตั้งใจ
ExtrasสำหรับaboutExerciseName
- รับค่าความตั้งใจ
exerciseType=RUNNING- ใช้
aboutExerciseNameเพื่อค้นหาออบเจ็กต์ประเภทฐานข้อมูลที่เกี่ยวข้อง
- ใช้
ตอนนี้คลาส StatsWidget สามารถประมวลผลข้อมูล Intent ของ Android สำหรับ App Actions ที่เข้ามาได้แล้ว ให้อัปเดตตรรกะของขั้นตอนการสร้างวิดเจ็ตเพื่อตรวจสอบว่า App Action เป็นตัวเรียกใช้วิดเจ็ตหรือไม่
- ใน
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 ของการกระทําของแอป
- เพิ่มฟังก์ชัน
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 ซึ่งจัดรูปแบบข้อมูลกิจกรรมที่แสดงผลจากฐานข้อมูลแอป
- ใน
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 แก่อินสแตนซ์วิดเจ็ต
- เพิ่มฟังก์ชัน
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 เมื่อฐานข้อมูลการออกกำลังกายแสดงข้อมูลว่างสำหรับประเภทการออกกำลังกายที่ขอ
- อัปเดตฟังก์ชัน
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 ด้วยปลั๊กอิน
- ไปที่เครื่องมือ > Google Assistant > เครื่องมือทดสอบการดำเนินการของแอป ระบบอาจขอให้คุณลงชื่อเข้าใช้ Android Studio โดยใช้บัญชี Google
- คลิกสร้างตัวอย่าง หากได้รับแจ้ง ให้อ่านและยอมรับนโยบายและข้อกำหนดในการให้บริการของการดำเนินการของแอป
ทดสอบประเภทการออกกำลังกายที่คาดไว้
ส่งคืนวิดเจ็ตที่แสดงข้อมูลเกี่ยวกับการวิ่งครั้งล่าสุดที่เสร็จสมบูรณ์ในแอปโดยทำตามขั้นตอนต่อไปนี้ในเครื่องมือทดสอบ
- ในขั้นตอนแรกที่เครื่องมือขอให้คุณเลือกและกำหนดค่า BII ให้เลือก
actions.intent.GET_EXERCISE_OBSERVATION - ในช่อง exerciseObservation ให้อัปเดตชื่อการออกกำลังกายเริ่มต้นจาก
climbingเป็นrun - คลิกเรียกใช้ App Action

ทดสอบการออกกำลังกายประเภทที่ไม่คาดคิด
วิธีทดสอบประเภทการออกกำลังกายที่ไม่คาดคิดในเครื่องมือทดสอบ
- ในช่อง exerciseObservation ให้อัปเดตค่า
nameจากRunเป็นClimbing - คลิกเรียกใช้ App Action
Assistant ควรแสดงวิดเจ็ตที่มีข้อมูล "ไม่พบกิจกรรม"

ทดสอบเจตนาสำรอง
คําค้นหาที่ทําให้เกิด Intent สำรองควรแสดงวิดเจ็ตที่แสดงข้อมูลเกี่ยวกับกิจกรรมที่บันทึกล่าสุดของแบบฝึกหัดประเภทใดก็ได้
วิธีทดสอบเจตนาสำรอง
- ในช่อง exerciseObservation ให้ลบออบเจ็กต์
aboutExercise - คลิกเรียกใช้ App Action
Assistant ควรแสดงวิดเจ็ตที่มีข้อมูลการออกกำลังกายล่าสุดที่เสร็จสมบูรณ์

7. ขั้นตอนถัดไป
ยินดีด้วย
ตอนนี้คุณสามารถตอบคำค้นหาของผู้ใช้ได้โดยใช้วิดเจ็ต Android กับ Assistant
สิ่งที่เราได้พูดถึงไปแล้ว
ในโค้ดแล็บนี้ คุณได้เรียนรู้วิธีทำสิ่งต่อไปนี้
- เพิ่มวิดเจ็ตแอปไปยัง BII
- แก้ไขวิดเจ็ตเพื่อเข้าถึงพารามิเตอร์จาก Android Extras
ขั้นตอนถัดไป
จากตรงนี้ คุณสามารถลองปรับแต่งแอปฟิตเนสเพิ่มเติมได้ หากต้องการดูโปรเจ็กต์ที่เสร็จสมบูรณ์แล้ว โปรดดูที่เก็บหลักใน GitHub
คำแนะนำบางส่วนสำหรับการเรียนรู้เพิ่มเติมเกี่ยวกับการขยายแอปนี้ด้วยการดำเนินการของแอปมีดังนี้
- ไปที่ข้อมูลอ้างอิงเจตนาในตัวของการดำเนินการของแอปเพื่อดูวิธีอื่นๆ ในการขยายแอปไปยัง Assistant
หากต้องการเดินทางต่อใน Actions on Google โปรดดูแหล่งข้อมูลต่อไปนี้
- developers.google.com/assistant/app: เว็บไซต์เอกสารอย่างเป็นทางการสำหรับ App Actions ของ Google Assistant
- ดัชนีตัวอย่าง App Actions: ตัวอย่างแอปและโค้ดสําหรับสํารวจความสามารถของ App Actions
- ที่เก็บข้อมูล GitHub ของ Actions on Google: ตัวอย่างโค้ดและไลบรารี
- r/GoogleAssistantDev: ชุมชน Reddit อย่างเป็นทางการสำหรับนักพัฒนาซอฟต์แวร์ที่ทำงานร่วมกับ Google Assistant
ติดตามเราบน Twitter @ActionsOnGoogle เพื่อรับทราบประกาศล่าสุด และทวีตถึง #appactions เพื่อแชร์สิ่งที่คุณสร้าง
แบบสำรวจความคิดเห็น
สุดท้าย โปรดตอบแบบสำรวจนี้เพื่อแสดงความคิดเห็นเกี่ยวกับประสบการณ์การใช้งาน Codelab นี้