1. ภาพรวม
ใน Codelab การดำเนินการของแอปเวอร์ชันแรก คุณได้เรียนรู้วิธีขยาย Google Assistant ให้ไปใช้แอปฟิตเนสตัวอย่างด้วยการใช้ Intent ในตัว (BII) จากหมวดหมู่สุขภาพและการออกกำลังกาย BII
การดำเนินการของแอปช่วยให้ผู้ใช้เรียกใช้ฟีเจอร์ของแอปที่ต้องการจาก Assistant ได้โดยตรงด้วยการถามสิ่งต่างๆ อย่างเช่น "Ok Google เริ่มเรียกใช้ใน ExampleApp" นอกจากการเปิดตัวแอปแล้ว Assistant สามารถแสดงวิดเจ็ต Android แบบอินเทอร์แอกทีฟให้แก่ผู้ใช้เพื่อดำเนินการตามคำขอสำหรับ 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 เพื่อประกาศ
แผนภาพต่อไปนี้จะแสดงขั้นตอนนี้
วิดเจ็ต 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 นี้ คุณจะได้อัปเดตแอปตัวอย่างเพื่อจัดการฟังก์ชันการดำเนินการของแอป การเปลี่ยนแปลงเหล่านี้ประกอบด้วย
- การกำหนดค่าความสามารถ
GET_EXERCISE_OBSERVATION
BII เพื่อแสดงผลอินสแตนซ์ของออบเจ็กต์StatsWidget
- อัปเดตชั้นเรียน
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
- คลิกนำเข้าโปรเจ็กต์ในกล่องโต้ตอบยินดีต้อนรับสู่ Android Studio
- ค้นหาและเลือกโฟลเดอร์ที่คุณโคลนที่เก็บ
หากต้องการดูเวอร์ชันของแอปที่แสดงถึง Codelab ที่สมบูรณ์ ให้โคลนที่เก็บของแอปตัวอย่างโดยใช้แฟล็ก --branch master
อัปเดตรหัสแอปพลิเคชัน Android
การอัปเดตรหัสแอปพลิเคชันของแอปจะระบุแอปบนอุปกรณ์ทดสอบโดยไม่ซ้ำกัน และหลีกเลี่ยงไม่ให้มี "ชื่อแพ็กเกจซ้ำ" หากอัปโหลดแอปไปยัง Play Console หากต้องการอัปเดตรหัสแอปพลิเคชัน ให้เปิด app/build.gradle
:
android {
...
defaultConfig {
applicationId "com.MYUNIQUENAME.android.fitactions"
...
}
}
แทนที่ "MYUNIQUENAME" ในช่อง applicationId
เพื่อนำเสนอข้อมูลเฉพาะสำหรับคุณ
ติดตั้งปลั๊กอินทดสอบ
ปลั๊กอิน Google Assistant ให้คุณทดสอบการดำเนินการของแอปในอุปกรณ์ทดสอบ โดยจะทำงานโดยส่งข้อมูลไปยัง Assistant ผ่านแอป Google ในอุปกรณ์ Android หากยังไม่มี ให้ติดตั้งโดยทำตามขั้นตอนต่อไปนี้
- ไปที่ไฟล์ > การตั้งค่า (Android Studio > ค่ากำหนดบน MacOS)
- ในส่วนปลั๊กอิน ให้ไปที่ Marketplace และค้นหา "Google Assistant" นอกจากนี้ คุณยังดาวน์โหลดและติดตั้งเครื่องมือทดสอบด้วยตนเองได้ด้วย
- ติดตั้งเครื่องมือและรีสตาร์ท Android Studio
ทดสอบแอปในอุปกรณ์
ก่อนที่จะทำการเปลี่ยนแปลงเพิ่มเติมกับแอป คุณควรทราบถึงสิ่งที่แอปตัวอย่างสามารถทำอะไรได้บ้าง
เรียกใช้แอปในอุปกรณ์ทดสอบ ดังนี้
- ใน Android Studio ให้เลือกอุปกรณ์จริงหรืออุปกรณ์เสมือน แล้วเลือกเรียกใช้ > เรียกใช้แอป หรือคลิกเรียกใช้ในแถบเครื่องมือ
- กดปุ่มหน้าแรกค้างไว้เพื่อตั้งค่า Assistant และยืนยันว่าใช้งานได้ คุณจะต้องลงชื่อเข้าใช้ Assistant ในอุปกรณ์ หากยังไม่ได้ดำเนินการ
ดูข้อมูลเพิ่มเติมเกี่ยวกับอุปกรณ์เสมือนของ Android ได้ที่สร้างและจัดการอุปกรณ์เสมือน
สำรวจแอปคร่าวๆ เพื่อดูว่าแอปทำอะไรได้บ้าง แอปจะป้อนข้อมูลกิจกรรมการออกกำลังกาย 10 รายการล่วงหน้าและแสดงข้อมูลนี้ในมุมมองแรก
ลองใช้วิดเจ็ตที่มีอยู่
- แตะปุ่มหน้าแรกเพื่อไปที่หน้าจอหลักของอุปกรณ์ทดสอบ
- กดพื้นที่ว่างในหน้าจอหลักค้างไว้แล้วเลือกวิดเจ็ต
- เลื่อนรายการวิดเจ็ตลงมาที่ FitActions
- กดไอคอน FitActions ค้างไว้ แล้ววางวิดเจ็ตของไอคอนนั้นบนหน้าจอหลัก
4. เพิ่มการดำเนินการของแอป
ในขั้นตอนนี้ ให้เพิ่มความสามารถ 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 กับ Intent ของ 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>
เพิ่ม Intent สำรอง
Intent สำรองจะจัดการกับสถานการณ์ที่การค้นหาของผู้ใช้ไม่สามารถตอบสนองได้ เนื่องจากการค้นหาไม่มีพารามิเตอร์ที่จำเป็นสำหรับความสามารถนี้ ความสามารถ GET_EXERCISE_OBSERVATION
ต้องใช้พารามิเตอร์ exerciseObservation.aboutExercise.name
ซึ่งระบุโดยแอตทริบิวต์ android:required="true"
ในสถานการณ์เช่นนี้ Assistant กําหนดให้คุณกําหนด Intent สำรองเพื่อให้คำขอดำเนินการได้สำเร็จ แม้ว่าจะไม่มีการระบุพารามิเตอร์ในการค้นหาก็ตาม
- ใน
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 ที่กำหนดเองสำหรับวิดเจ็ตของคุณ
- เพิ่มทรัพยากร Dependency ของไลบรารีส่วนขยายวิดเจ็ตลงในทรัพยากร
/app/build.gradle
ของแอปตัวอย่าง:
คลิกซิงค์ตอนนี้ในช่องคำเตือนที่ปรากฏใน Android Studio การซิงค์หลังจากเปลี่ยน// app/build.gradle dependencies { //... implementation "com.google.assistant.appactions:widgets:0.0.1" }
build.gradle
ทุกครั้งจะช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดขณะสร้างแอป
เพิ่มบริการวิดเจ็ต
บริการเป็นคอมโพเนนต์ของแอปพลิเคชันที่ทํางานเป็นเวลานานในเบื้องหลังได้ แอปของคุณต้องให้บริการในการประมวลผลคำขอวิดเจ็ต
- เพิ่มบริการลงในทรัพยากร
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
และนำเข้าไลบรารีส่วนขยายของวิดเจ็ต App Actions:// 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
= แพ็กเกจ- กลุ่มคือออบเจ็กต์ที่มีจุดประสงค์เพื่อใช้ข้ามขอบเขตของกระบวนการ ระหว่างกิจกรรมที่มี Intent และเพื่อเก็บสถานะชั่วคราวในการเปลี่ยนแปลงการกำหนดค่า Assistant ใช้ออบเจ็กต์
Bundle
รายการเพื่อส่งข้อมูลการกำหนดค่าไปยังวิดเจ็ต
- กลุ่มคือออบเจ็กต์ที่มีจุดประสงค์เพื่อใช้ข้ามขอบเขตของกระบวนการ ระหว่างกิจกรรมที่มี Intent และเพื่อเก็บสถานะชั่วคราวในการเปลี่ยนแปลงการกำหนดค่า Assistant ใช้ออบเจ็กต์
bii
=actions.intent.GET_EXERCISE_OBSERVATION
- ชื่อของ BII มีอยู่ในแพ็กเกจโดยใช้
AppActionsWidgetExtension
- ชื่อของ BII มีอยู่ในแพ็กเกจโดยใช้
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
- ดึงค่า Intent
Extras
ของaboutExerciseName
- ดึงค่า Intent
exerciseType
=RUNNING
- ใช้
aboutExerciseName
เพื่อค้นหาออบเจ็กต์ประเภทฐานข้อมูลที่สอดคล้องกัน
- ใช้
เมื่อคลาส StatsWidget
ประมวลผลข้อมูล Intent ของการดำเนินการของแอป Android ที่เข้ามาใหม่ได้แล้ว ให้อัปเดตลอจิกของกระบวนการสร้างวิดเจ็ตเพื่อตรวจสอบว่าวิดเจ็ตได้ทริกเกอร์โดยการดำเนินการของแอปหรือไม่
- ใน
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() } } }
ในโค้ดก่อนหน้านี้ ให้ใช้คลาส repository ที่มีอยู่ในแอปเพื่อเรียกข้อมูลการออกกำลังกายจากฐานข้อมูลในเครื่องของแอป คลาสนี้จะมี API ที่ช่วยให้เข้าถึงฐานข้อมูลได้ง่ายขึ้น ที่เก็บจะทำงานโดยการเปิดเผยออบเจ็กต์ LiveData เมื่อดำเนินการค้นหาในฐานข้อมูล ในโค้ด คุณสังเกตเห็น LiveData
นี้เพื่อดึงข้อมูลกิจกรรมการออกกำลังกายล่าสุด
เปิดใช้ TTS
คุณระบุสตริง TTS เพื่อให้ Assistant ประกาศเมื่อแสดงวิดเจ็ตได้ เราขอแนะนำให้รวมส่วนนี้ด้วยเพื่อให้วิดเจ็ตมีเสียงประกอบ ฟังก์ชันนี้มาจากไลบรารีส่วนขยายวิดเจ็ตของ App Actions ซึ่งจะช่วยให้คุณตั้งค่าข้อความและการแนะนำ 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. ทดสอบการดำเนินการของแอป
ในระหว่างการพัฒนา ให้ใช้ปลั๊กอิน Google Assistant เพื่อดูตัวอย่างการดำเนินการของแอป Assistant ในอุปกรณ์ทดสอบ คุณปรับพารามิเตอร์ Intent ของการดำเนินการของแอปได้ด้วยเครื่องมือเพื่อทดสอบวิธีที่การดำเนินการของคุณจัดการกับวิธีต่างๆ ที่ผู้ใช้อาจขอให้ Assistant เรียกใช้การดำเนินการดังกล่าว
สร้างตัวอย่างเพลง
วิธีทดสอบการดำเนินการของแอปด้วยปลั๊กอิน
- ไปที่เครื่องมือ > Google Assistant > เครื่องมือทดสอบการดำเนินการของแอป ระบบอาจขอให้คุณลงชื่อเข้าใช้ Android Studio โดยใช้บัญชี Google
- คลิกสร้างพรีวิว หากระบบถาม ให้อ่านและยอมรับนโยบายและข้อกำหนดในการให้บริการของการดำเนินการของแอป
ทดสอบประเภทการออกกำลังกายที่คาดไว้
แสดงวิดเจ็ตที่แสดงข้อมูลเกี่ยวกับการเรียกใช้ครั้งสุดท้ายที่ดำเนินการในแอปเสร็จสิ้นโดยทำตามขั้นตอนเหล่านี้ในเครื่องมือทดสอบ
- ในขั้นตอนแรกที่เครื่องมือจะขอให้คุณเลือกและกำหนดค่า BII ให้เลือก
actions.intent.GET_EXERCISE_OBSERVATION
- ในช่อง exerciseObservation ให้อัปเดตชื่อการออกกำลังกายเริ่มต้นจาก
climbing
เป็นrun
- คลิกเรียกใช้การดำเนินการของแอป
ทดสอบประเภทการออกกำลังกายที่ไม่คาดคิด
วิธีทดสอบประเภทการออกกำลังกายที่ไม่คาดคิดในเครื่องมือทดสอบ
- ในช่อง exerciseObservation ให้อัปเดตค่า
name
จากRun
เป็นClimbing
- คลิกเรียกใช้การดำเนินการของแอป
Assistant ควรคืนวิดเจ็ตที่แสดงข้อความ "ไม่พบกิจกรรม"
ทดสอบ Intent สำรอง
คำค้นหาที่ทริกเกอร์ Intent สำรองควรแสดงผลวิดเจ็ตที่แสดงข้อมูลเกี่ยวกับกิจกรรมที่บันทึกไว้ล่าสุดสำหรับการออกกำลังกายทุกประเภท
วิธีทดสอบ Intent สำรอง
- ในช่อง exerciseObservation ให้ลบออบเจ็กต์
aboutExercise
- คลิกเรียกใช้การดำเนินการของแอป
Assistant ควรจะแสดงวิดเจ็ตที่แสดงข้อมูลการออกกำลังกายครั้งล่าสุด
7. ขั้นตอนถัดไป
ยินดีด้วย
ตอนนี้คุณสามารถดำเนินการตามผู้ใช้ โดยใช้วิดเจ็ต Android ที่มี Assistant
สรุปประเด็นที่ได้พูดถึง
คุณได้เรียนรู้วิธีต่อไปนี้ใน Codelab แล้ว
- เพิ่มวิดเจ็ตแอปลงใน BII
- แก้ไขวิดเจ็ตเพื่อเข้าถึงพารามิเตอร์จาก Android Extras
ขั้นตอนถัดไป
จากที่นี่ คุณสามารถลองปรับแต่งแอปฟิตเนสเพิ่มเติมได้ หากต้องการอ้างอิงโปรเจ็กต์ที่เสร็จสมบูรณ์แล้ว ให้ดูที่เก็บหลักใน GitHub
ต่อไปนี้คือคำแนะนำบางส่วนสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการขยายแอปนี้ด้วยการดำเนินการของแอป
- ไปที่ข้อมูลอ้างอิง Intent ในตัวของการดำเนินการของแอปเพื่อดูวิธีอื่นๆ ในการขยายแอปไปยัง Assistant
โปรดสำรวจแหล่งข้อมูลเหล่านี้เพื่อดำเนินการต่อในเส้นทางของ Actions on Google
- developers.google.com/assistant/app: เว็บไซต์เอกสารประกอบอย่างเป็นทางการเกี่ยวกับการดำเนินการของแอป Google Assistant
- ดัชนีตัวอย่างการดำเนินการของแอป: แอปและโค้ดตัวอย่างสำหรับสำรวจความสามารถของการดำเนินการของแอป
- Actions on Google GitHub repo: โค้ดและไลบรารีตัวอย่าง
- r/GoogleAssistantDev: ชุมชน Reddit อย่างเป็นทางการสำหรับนักพัฒนาซอฟต์แวร์ที่ทำงานร่วมกับ Google Assistant
ติดตามเราบน Twitter @ActionsOnGoogle เพื่อติดตามประกาศล่าสุดของเรา และทวีตไปที่ #appactions เพื่อแชร์สิ่งที่คุณสร้างขึ้น
แบบสำรวจความคิดเห็น
สุดท้าย โปรดกรอกข้อมูลในแบบสำรวจนี้เพื่อแสดงความคิดเห็นเกี่ยวกับประสบการณ์การใช้งาน Codelab นี้