เกี่ยวกับ Codelab นี้
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 นี้