ขยายแอป Android ให้รองรับ Google Assistant ด้วยการดำเนินการของแอป

1. ภาพรวม

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

Codelab นี้ครอบคลุมแนวคิดระดับเริ่มต้นสำหรับการพัฒนาด้วย App Actions คุณควรมีประสบการณ์ในการพัฒนาแอป Android และ Android Intent มาก่อนจึงจะทำตาม Codelab นี้ได้ หากเพิ่งเริ่มใช้ Android คุณอาจต้องการเริ่มต้นใช้งาน Codelab สำหรับพื้นฐานของนักพัฒนาแอป Android แทน

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

ในโค้ดแล็บนี้ คุณจะได้เพิ่ม Intent ในตัว (BII) ของ App Actions 2 รายการลงในแอป Android ฟิตเนสตัวอย่าง ซึ่งจะช่วยให้ผู้ใช้เริ่มและหยุดตัวจับเวลาออกกำลังกายได้โดยใช้เสียง

สิ่งที่คุณจะได้เรียนรู้

คุณจะได้เรียนรู้วิธีใช้ BII จากหมวดหมู่สุขภาพและการออกกำลังกายเพื่อขยาย Assistant ไปยังแอป Android นอกจากนี้ คุณยังจะได้เรียนรู้วิธีใช้ปลั๊กอิน Google Assistant สำหรับ Android Studio เพื่อทดสอบ BII

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

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

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

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

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

App Actions เชื่อมต่อผู้ใช้จาก Google Assistant ไปยังแอป Android ของคุณ โดยมีวิธีการทำงานดังนี้

เมื่อผู้ใช้ขอให้ Assistant ทำงานโดยใช้แอปของคุณ Assistant จะจับคู่คำค้นหากับ App Actions capability ที่กำหนดไว้ในทรัพยากร XML ของ shortcuts.xml ในแอป

แผนภาพลำดับงานที่แสดงวิธีที่ Google Assistant ประมวลผลคำค้นหาด้วยเสียงของ App Actions

รูปที่ 1 โฟลว์ชาร์ตที่แสดงวิธีที่ Assistant ประมวลผลคำค้นหาด้วยเสียงของ App Actions

องค์ประกอบความสามารถแต่ละรายการจะกำหนดสิ่งต่อไปนี้

  • เจตนา: เจตนาเสียงของการกระทำในแอปที่ควรทริกเกอร์ความสามารถ
  • การดำเนินการตามคำสั่งอย่างน้อย 1 รายการ: Intent ของ Android หรือ Deep Link ที่ Assistant สร้างขึ้นเพื่อเปิดแอปและดำเนินการตามคำขอด้วยเสียงของผู้ใช้ คำจำกัดความการดำเนินการตามคำสั่งจะระบุว่าระบบคาดหวังพารามิเตอร์ใดจากคำค้นหาของผู้ใช้ และควรเข้ารหัสพารามิเตอร์เหล่านั้นลงในวิธีการเปิดใช้แอปอย่างไร

Intent

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

การดำเนินการตามคำสั่งซื้อ

เมื่อคำขอของผู้ใช้ทริกเกอร์ App Action ใน shortcuts.xml กิจกรรม Android ของคุณจะต้องตรวจหาและจัดการ Intent หรือ Deep Link ของ Android ที่เข้ามา แล้วมอบฟังก์ชันการทำงานที่ผู้ใช้ต้องการ ผลลัพธ์คือประสบการณ์ของผู้ใช้ที่ขับเคลื่อนด้วยเสียง ซึ่ง Assistant จะเรียกใช้แอปของคุณเพื่อตอบคำค้นหาของผู้ใช้

3. เตรียมสภาพแวดล้อมในการพัฒนา

Codelab นี้ใช้แอปตัวอย่างฟิตเนสสำหรับ Android แอปนี้ช่วยให้ผู้ใช้เริ่มและหยุดตัวจับเวลาออกกำลังกาย รวมถึงดูสถิติเกี่ยวกับกิจวัตรการออกกำลังกายได้

ดาวน์โหลดไฟล์ฐาน

หากต้องการรับไฟล์พื้นฐานสำหรับ Codelab นี้ ให้เรียกใช้คำสั่งต่อไปนี้เพื่อโคลนที่เก็บ GitHub

git clone --branch codelab-start https://github.com/actions-on-google/appactions-fitness-kotlin.git

เมื่อโคลนที่เก็บแล้ว ให้เปิดที่เก็บใน Android Studio โดยทำดังนี้

  1. ในกล่องโต้ตอบ Welcome to Android Studio ให้คลิก Import project
  2. ค้นหาและเลือกโฟลเดอร์ที่คุณโคลนที่เก็บ

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

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

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

แทนที่ "MYUNIQUENAME" ในapplicationIdด้วยชื่อที่ไม่ซ้ำกันของคุณ

ลองใช้แอปในอุปกรณ์

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

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

ทำตามขั้นตอนต่อไปนี้เพื่อทดสอบแอป

  1. ใน Android Studio ให้เลือกเรียกใช้ > เรียกใช้แอป หรือคลิกเรียกใช้acabcb8f8634af20.png ในแถบเครื่องมือ
  2. หากใช้อุปกรณ์เสมือน ในกล่องโต้ตอบเลือกเป้าหมายการติดตั้งใช้งาน ให้เลือกอุปกรณ์เสมือน แล้วคลิกตกลง เวอร์ชันระบบปฏิบัติการที่แนะนำคือ Android 8 (API ระดับ 26) ขึ้นไป แม้ว่า Actions จะทำงานในอุปกรณ์ที่ใช้ Android 5 (API ระดับ 21) ได้ก็ตาม
  3. หลังจากเปิดแอปแล้ว ให้กดปุ่มหน้าแรกค้างไว้เพื่อตั้งค่า Assistant และตรวจสอบว่าใช้งานได้ ลงชื่อเข้าใช้ Assistant หากยังไม่ได้ดำเนินการ
  4. เปิดแอปอีกครั้ง

โทรศัพท์ที่เปิดแอป Fit Actions อยู่ ซึ่งแสดงสถิติการออกกำลังกาย

รูปที่ 2 แอปตัวอย่าง Fit Actions ที่แสดงสถิติการออกกำลังกาย

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

ติดตั้งปลั๊กอิน Google Assistant

ปลั๊กอิน Google Assistant ช่วยให้คุณทดสอบ App Actions ในอุปกรณ์ทดสอบได้ ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มลงใน Android Studio

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

4. เพิ่มความสามารถ BII ของการเริ่มออกกำลังกาย

actions.intent.START_EXERCISE BII ช่วยให้ผู้ใช้เปิดแอปและเริ่มออกกำลังกายได้โดยใช้เสียง ในขั้นตอนนี้ คุณจะใช้ความสามารถสำหรับ BII นี้ ซึ่งช่วยให้ผู้ใช้ขอให้ Assistant เริ่มการวิ่งในแอปฟิตเนสได้

กำหนดความสามารถ

Assistant ใช้องค์ประกอบ capability ที่กำหนดไว้ใน shortcuts.xml เพื่อประมวลผลคำสั่งเสียงด้วยขั้นตอนต่อไปนี้

  1. Assistant จะจับคู่คำค้นหาด้วยเสียงของผู้ใช้กับ BII ที่กำหนดไว้ในความสามารถของแอป
  2. Assistant จะดึงค่าจากคำค้นหาไปยังพารามิเตอร์ BII ระบบจะเพิ่มพารามิเตอร์แต่ละรายการลงใน Bundle ที่แนบมากับ Intent ที่สร้างขึ้น
  3. Assistant ใช้ Intent เพื่อเปิดแอป ซึ่งจะทำให้แอปเข้าถึงพารามิเตอร์ที่รวมไว้ได้

START_EXERCISE BII รองรับพารามิเตอร์ exercise.name BII คุณจะใช้พารามิเตอร์นี้เพื่อให้ผู้ใช้ระบุประเภทการออกกำลังกายที่จะติดตามในแอปได้

เพิ่ม BII ของ START_EXERCISE ลงในแอปโดยเพิ่ม capability นี้ลงใน shortcuts.xml ซึ่งอยู่ในไดเรกทอรีโปรเจ็กต์ตัวอย่าง app/src/main/res/xml

<!-- shortcuts.xml -->

<capability android:name="actions.intent.START_EXERCISE">
  <intent
    android:action="android.intent.action.VIEW"
    android:targetPackage="PUT_YOUR_APPLICATION_ID_HERE"
    android:targetClass="com.devrel.android.fitactions.FitMainActivity">
    <parameter
      android:name="exercise.name"
      android:key="exerciseType"/>
  </intent>
</capability>

แทนที่ PUT_YOUR_APPLICATION_ID_HERE ด้วย applicationId ที่ไม่ซ้ำกันซึ่งคุณกำหนดไว้ในขั้นตอนก่อนหน้า

XML ตัวอย่างข้างต้นมีลักษณะดังนี้

  • ประกาศความสามารถสำหรับ START_EXERCISE BII
  • ระบุ intent ของ Android ที่ Assistant สร้างขึ้นเพื่อเปิดแอป
    • แอตทริบิวต์ targetPackage และ targetClass ระบุกิจกรรมที่รับ
    • แอตทริบิวต์ parameter จะแมปพารามิเตอร์ BII exercise.name กับ exerciseType ใน Bundle ที่กิจกรรมได้รับ

จัดการพารามิเตอร์ BII ด้วยพื้นที่โฆษณาในบรรทัด

พารามิเตอร์ BII แสดงถึงองค์ประกอบที่ดึงมาจากคำค้นหาของผู้ใช้ Assistant ตัวอย่างเช่น เมื่อผู้ใช้พูดว่า "Ok Google เริ่มวิ่งใน ExampleApp" Assistant จะดึง "run" ไปยังพารามิเตอร์ BII ของ exercise.name schema.org สำหรับ BII บางรายการ คุณสามารถสั่งให้ Assistant จับคู่พารามิเตอร์ BII กับชุดตัวระบุที่แอปของคุณคาดหวังได้

โดยทำได้ด้วยการเชื่อมโยงองค์ประกอบพื้นที่โฆษณาในบรรทัดกับพารามิเตอร์ BII พื้นที่โฆษณาในบรรทัดคือชุดค่าพารามิเตอร์ BII ที่รองรับ เช่น "วิ่ง" "เดินป่า" และ "วิ่งเหยาะๆ" รวมถึงรหัสทางลัดที่เกี่ยวข้อง เช่น EXERCISE_RUN การเชื่อมโยงพื้นที่โฆษณานี้ช่วยให้ Assistant ส่งรหัสทางลัดสำหรับพารามิเตอร์ที่ตรงกันไปยังกิจกรรมการดำเนินการตามคำสั่งแทนค่าคำค้นหาดิบได้

พารามิเตอร์ BII บางรายการ เช่น exercise.name ต้องใช้พื้นที่โฆษณาในบรรทัดจึงจะทำงานได้ หากต้องการจัดการพารามิเตอร์นี้ ให้เพิ่มองค์ประกอบสินค้าคงคลัง shortcut ต่อไปนี้ลงใน shortcuts.xml

<!-- shortcuts.xml -->

<shortcuts>
  <shortcut
    android:shortcutId="running"
    android:shortcutShortLabel="@string/activity_running">
    <capability-binding android:key="actions.intent.START_EXERCISE">
      <parameter-binding
        android:key="exercise.name"
        android:value="@array/runningSynonyms"/>
    </capability-binding>
  </shortcut>

  <shortcut
    android:shortcutId="walking"
    android:shortcutShortLabel="@string/activity_walking">
    <capability-binding android:key="actions.intent.START_EXERCISE">
      <parameter-binding
        android:key="exercise.name"
        android:value="@array/walkingSynonyms"/>
    </capability-binding>
  </shortcut>

  <shortcut
    android:shortcutId="cycling"
    android:shortcutShortLabel="@string/activity_cycling">
    <capability-binding android:key="actions.intent.START_EXERCISE">
      <parameter-binding
        android:key="exercise.name"
        android:value="@array/cyclingSynonyms"/>
    </capability-binding>
  </shortcut>

  <capability> ... </capability>
</shortcuts>

ในโค้ดก่อนหน้า คุณได้กำหนดทางลัด 3 รายการที่แสดงถึงพื้นที่โฆษณาในบรรทัดสำหรับประเภทการออกกำลังกายที่แอปนี้รองรับ ได้แก่ การวิ่ง การเดิน และการปั่นจักรยาน ทางลัดแต่ละรายการจะเชื่อมโยงกับความสามารถในลักษณะต่อไปนี้

  • แอตทริบิวต์ android:key ขององค์ประกอบ capability-binding แต่ละรายการจะอ้างอิงถึง START_EXCERCISE BII เดียวกันที่กำหนดไว้สำหรับความสามารถ
  • องค์ประกอบ parameter-binding ของแป้นพิมพ์ลัดแต่ละรายการไปยังพารามิเตอร์ exercise.name BII

เพิ่มคำพ้องความหมายของพื้นที่โฆษณาในบรรทัด

แอตทริบิวต์ android:value ขององค์ประกอบ parameter-binding ในทางลัดสินค้าคงคลังก่อนหน้าจะอ้างอิงถึงทรัพยากรอาร์เรย์ของคำพ้องความหมายสำหรับองค์ประกอบสินค้าคงคลังแต่ละรายการ คำพ้องความหมายช่วยให้รูปแบบต่างๆ ของประเภทองค์ประกอบ เช่น "วิ่ง" "วิ่งเหยาะๆ" และ "วิ่งเร็ว" อ้างอิงถึง shortcutId เดียวกันได้ เพิ่มรายการคำพ้องความหมายต่อไปนี้ลงในarray.xmlทรัพยากรของโปรเจ็กต์

<!-- array.xml -->
<array name="runningSynonyms">
  <item>Run</item>
  <item>Jog</item>
  <item>Jogging</item>
  <item>Sprint</item>
</array>

<array name="walkingSynonyms">
  <item>Walk</item>
  <item>Hike</item>
  <item>Hiking</item>
</array>

<array name="cyclingSynonyms">
  <item>Biking</item>
  <item>Riding</item>
  <item>Pedaling</item>
</array>

ดำเนินการตาม Intent ของ Android ที่เข้ามา

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

ก่อนอื่น ให้แทนที่ฟังก์ชัน Intent.handleIntent ด้วยโค้ดต่อไปนี้

//FitMainActivity.kt

private fun Intent.handleIntent() {
  when (action) {
    // When the BII is matched, Intent.Action_VIEW will be used
    Intent.ACTION_VIEW -> handleIntent(data)
    // Otherwise start the app as you would normally do.
    else -> showDefaultView()
  }
}

จากนั้นเพิ่มhandleIntentฟังก์ชันใหม่ลงในคลาสด้วยโค้ดต่อไปนี้

//FitMainActivity.kt

/**
 * Use extras provided by the intent to handle the different BIIs
 */

private fun handleIntent(data: Uri?) {
  // path is normally used to indicate which view should be displayed
  // i.e https://fit-actions.firebaseapp.com/start?exerciseType="Running" -> path = "start"
  var actionHandled = true

  val startExercise = intent?.extras?.getString(START_EXERCISE)
  // Add stopExercise variable here

  if (startExercise != null){
    val type = FitActivity.Type.find(startExercise)
    val arguments = Bundle().apply {
      putSerializable(FitTrackingFragment.PARAM_TYPE, type)
    }
    updateView(FitTrackingFragment::class.java, arguments)
  } // Add conditional for stopExercise
  else{
   // path is not supported or invalid, start normal flow.
   showDefaultView()

   // Unknown or invalid action
   actionHandled = false
  }
  notifyActionSuccess(actionHandled)
}

ในIntent.handleIntentฟังก์ชันก่อนหน้า เมื่อACTION_VIEWทริกเกอร์ ระบบจะส่งข้อมูล Intent ของการดำเนินการของแอปไปยังฟังก์ชัน handleIntent พารามิเตอร์ BII ที่รวมอยู่ในความตั้งใจ START_EXERCISE จะเข้าถึงได้ผ่าน intent?.extras?.getString(START_EXERCISE) ส่วนที่เหลือของฟังก์ชันจะอัปเดต FitTrackingFragment เพื่อแสดงประเภทการออกกำลังกาย startExercise ที่เลือก

ทดสอบ App Action

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

หากต้องการทดสอบ App Action ด้วยปลั๊กอิน ให้ทำตามขั้นตอนต่อไปนี้

  1. เรียกใช้แอปใน Android Studio โดยเลือกเรียกใช้ > เรียกใช้แอป หรือคลิกไอคอนเรียกใช้ในแถบเครื่องมือด้านบน
  2. ไปที่เครื่องมือ > การทำงานของแอป > Google Assistant > เครื่องมือทดสอบการทำงานของแอป
  3. คลิกสร้างตัวอย่าง หากได้รับแจ้ง ให้อ่านและยอมรับนโยบายและข้อกำหนดในการให้บริการของการดำเนินการของแอป
  4. เลือกactions.intent.START_EXERCISEความตั้งใจในตัว
  5. ในช่องการออกกำลังกาย ให้ใช้ค่าเริ่มต้นเป็นวิ่ง
  6. คลิกเรียกใช้ App Action ตรวจสอบว่า Assistant ทำ Deep Link ไปยังตัวจับเวลาออกกำลังกายของแอป และตัวจับเวลาได้เริ่มการออกกำลังกายประเภทวิ่งแล้ว

คุณได้ติดตั้งใช้งาน App Actions แรกด้วย START_EXERCISE BII แล้ว ยินดีด้วย จากนั้นเราจะช่วยให้ผู้ใช้หยุดการออกกำลังกายที่กำลังดำเนินอยู่ในแอปของคุณได้

5. เพิ่มความสามารถ BII ในการหยุดการออกกำลังกาย

actions.intent.STOP_EXERCISE BII ช่วยให้ผู้ใช้หยุดเซสชันการออกกำลังกายได้โดยการถามคำสั่งต่างๆ เช่น "Ok Google หยุดการวิ่งของฉันใน ExampleApp" ใช้ BII นี้ในแอปฟิตเนสโดยเพิ่ม capability ที่ 2 ไปยัง shortcuts.xml ดังนี้

<!-- shortcuts.xml -->

<capability android:name="actions.intent.STOP_EXERCISE">
  <intent
    android:action="android.intent.action.VIEW"
    android:targetPackage="PUT_YOUR_APPLICATION_ID_HERE"
    android:targetClass="com.devrel.android.fitactions.FitMainActivity">
    <!-- Eg. name = "Running" -->
    <parameter
        android:name="exercise.name"
        android:key="stopExercise"/>
  </intent>
</capability>

แทนที่ PUT_YOUR_APPLICATION_ID_HERE ด้วย applicationId ที่ไม่ซ้ำกันของคุณ

จัดการพารามิเตอร์ BII ด้วยพื้นที่โฆษณาในบรรทัด

BII นี้รองรับexercise.nameพารามิเตอร์เดียวกับ BII ของ START_EXERCISE ซึ่งช่วยให้ผู้ใช้ระบุได้ว่าต้องการสิ้นสุดการออกกำลังกายที่ใช้งานอยู่ใด หากต้องการเปิดใช้ ให้เพิ่มชุดองค์ประกอบทางลัดของพื้นที่โฆษณาชุดที่ 2 ไปยัง shortcuts.xml โดยทำดังนี้

<!-- shortcuts.xml -->

<shortcut
  android:shortcutId="running"
  android:shortcutShortLabel="@string/activity_running">
  <capability-binding android:key="actions.intent.STOP_EXERCISE">
      <parameter-binding
          android:key="exercise.name"
          android:value="@array/runningSynonyms"/>
  </capability-binding>
</shortcut>

<shortcut
  android:shortcutId="walking"
  android:shortcutShortLabel="@string/activity_walking">
  <capability-binding android:key="actions.intent.STOP_EXERCISE">
      <parameter-binding
          android:key="exercise.name"
          android:value="@array/walkingSynonyms"/>
  </capability-binding>
</shortcut>

<shortcut
  android:shortcutId="cycling"
  android:shortcutShortLabel="@string/activity_cycling">
  <capability-binding android:key="actions.intent.STOP_EXERCISE">
      <parameter-binding
          android:key="exercise.name"
          android:value="@array/cyclingSynonyms"/>
  </capability-binding>
</shortcut>

ดำเนินการตาม Intent ของ Android ที่เข้ามา

เปิดใช้แอปเพื่อจัดการ Intent ของ Android ที่เข้ามา STOP_EXERCISE โดยการอัปเดตคลาส FitMainActivity ก่อนอื่น ให้เพิ่มตัวแปรลงในฟังก์ชัน handleIntent เพื่อเก็บข้อมูลความตั้งใจ STOP_EXERCISE ดังนี้

// FitMainActivity.kt

private fun handleIntent(data: Uri?) {
  val stopExercise = intent?.extras?.getString(STOP_EXERCISE)
  //...
}

จากนั้น อัปเดตตรรกะแบบมีเงื่อนไขของฟังก์ชัน handleIntent เพื่อจัดการเจตนา STOP_EXERCISE ดังนี้

// FitMainActivity.kt

private fun handleIntent(data: Uri?) {
  //...
  if (startExercise != null){
    val type = FitActivity.Type.find(startExercise)
    val arguments = Bundle().apply {
      putSerializable(FitTrackingFragment.PARAM_TYPE, type)
    }
    updateView(FitTrackingFragment::class.java, arguments)
  } // Add conditional for stopExercise
  <strong>
  } else if(stopExercise != null){
    // Stop the tracking service if any and return to home screen.
    stopService(Intent(this, FitTrackingService::class.java))
    updateView(FitStatsFragment::class.java)
  }
  </strong>
  //...
}

ในโค้ดก่อนหน้า คุณได้อัปเดตฟังก์ชัน handleIntent เพื่อตรวจสอบ BII ของ STOP_EXERCISE ใน Intent ของ Android ที่เข้ามา หากพบ ฟังก์ชันจะหยุดตัวจับเวลาที่ใช้งานอยู่และนำผู้ใช้กลับไปที่หน้าจอหลัก

ทดสอบ App Action

ทดสอบ App Action โดยใช้ปลั๊กอิน Google Assistant โดยทำตามขั้นตอนต่อไปนี้

  1. เรียกใช้แอปใน Android Studio โดยเลือกเรียกใช้ > เรียกใช้แอป หรือคลิกไอคอนเรียกใช้ในแถบเครื่องมือด้านบน
  2. เริ่มการออกกำลังกาย "วิ่ง" ใหม่ในแอป
  3. เปิดปลั๊กอินใน Android Studio โดยไปที่เครื่องมือ > การกระทําของแอป > Google Assistant > เครื่องมือทดสอบการกระทําของแอป
  4. คลิกสร้างตัวอย่าง
  5. เลือกactions.intent.STOP_EXERCISEความตั้งใจในตัว
  6. ในช่องการออกกำลังกาย ให้ใช้ค่าเริ่มต้นเป็นวิ่ง
  7. คลิกเรียกใช้ App Action ตรวจสอบว่า Assistant หยุดการออกกำลังกายและนำคุณกลับไปที่หน้าจอหลัก

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

ยินดีด้วย

ตอนนี้คุณเข้าใจวิธีเปิดใช้เสียงในแอป Android โดยใช้ Intent ในตัวของ Assistant แล้ว ใน Codelab นี้ คุณได้เรียนรู้สิ่งต่อไปนี้

  • วิธีอนุญาตให้ผู้ใช้เจาะลึกฟีเจอร์เฉพาะของแอปโดยใช้ Assistant
  • วิธีใช้พื้นที่โฆษณาในบรรทัด
  • วิธีทดสอบ BII โดยใช้ปลั๊กอิน Google Assistant

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

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

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

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

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

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

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