การเพิ่มประสิทธิภาพเนื้อหาตามบริบทสำหรับ Assistant

Android 6.0 Marshmallow เปิดตัววิธีใหม่ให้ผู้ใช้มีส่วนร่วมกับแอปผ่านแอปผู้ช่วย เช่น Google Assistant ผู้ช่วยเป็นหน้าต่างระดับบนสุดที่ผู้ใช้ดูการดำเนินการที่เกี่ยวข้องตามบริบทสำหรับกิจกรรมปัจจุบันได้ การดำเนินการเหล่านี้อาจรวมถึง Deep Link ไปยังแอปอื่นๆ ในอุปกรณ์ด้วย

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

แอปผู้ช่วย เช่น Google Assistant จะใช้หน้าต่างวางซ้อนของผู้ช่วยผ่านฟีเจอร์ที่เรียกว่า Now on Tap ซึ่งทำงานร่วมกับฟังก์ชันการทำงานระดับแพลตฟอร์ม Android ระบบจะอนุญาตให้ผู้ใช้เลือกแอปผู้ช่วย ซึ่งจะรับข้อมูลตามบริบทจากแอปของคุณโดยใช้ Assist API ของ Android

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

การใช้ผู้ช่วย

รูปที่ 1 แสดงการโต้ตอบทั่วไปของผู้ใช้กับผู้ช่วย เมื่อผู้ใช้กดปุ่มหน้าแรกค้างไว้ ระบบจะเรียกใช้การเรียกกลับ Assist API ในแอปต้นทาง (ขั้นตอนที่ 1) ผู้ช่วยจะแสดงผลหน้าต่างวางซ้อน (ขั้นตอนที่ 2 และ 3) จากนั้นผู้ใช้จะเลือกการดำเนินการที่ต้องการ Assistant จะทำการดำเนินการที่เลือก เช่น ทำให้ Intent เริ่มทำงานด้วย Deep Link ไปยังแอปร้านอาหาร (ปลายทาง) (ขั้นตอนที่ 4)

รูปที่ 1 ตัวอย่างการโต้ตอบของ Assistant กับฟีเจอร์ Now on Tap ของแอป Google

ผู้ใช้สามารถกำหนดค่าผู้ช่วยได้โดยเลือกการตั้งค่า > แอป > แอปเริ่มต้น > ผู้ช่วยและการป้อนข้อมูลด้วยเสียง ผู้ใช้จะเปลี่ยนตัวเลือกของระบบได้ เช่น การเข้าถึงเนื้อหาบนหน้าจอเป็นข้อความและการเข้าถึงภาพหน้าจอดังที่แสดงในรูปที่ 2

รูปที่ 2 การตั้งค่าแอปผู้ช่วยและข้อมูลเสียง

แอปต้นทาง

คุณเพียงต้องทําตามแนวทางปฏิบัติแนะนำด้านการช่วยเหลือพิเศษเพื่อให้แอปทำงานร่วมกับผู้ช่วยเป็นแหล่งข้อมูลของผู้ใช้ ส่วนนี้อธิบายวิธีให้ข้อมูลเพิ่มเติมเพื่อช่วยปรับปรุงประสบการณ์ของผู้ใช้ Assistant รวมถึงสถานการณ์ที่ต้องมีการจัดการพิเศษ เช่น มุมมองที่กำหนดเอง

แชร์ข้อมูลเพิ่มเติมกับ Assistant

นอกเหนือจากข้อความและภาพหน้าจอแล้ว แอปยังแชร์ข้อมูลอื่นๆ กับ Assistant ได้ด้วย ตัวอย่างเช่น แอปเพลงอาจเลือกส่งข้อมูลอัลบั้มปัจจุบันเพื่อให้ Assistant แนะนำการดำเนินการที่ชาญฉลาดยิ่งขึ้นซึ่งปรับให้เหมาะกับกิจกรรมปัจจุบัน โปรดทราบว่า Assist API ไม่ได้ให้การควบคุมสื่อ หากต้องการเพิ่มการควบคุมสื่อ ให้ดูที่ Google Assistant และแอปสื่อ

หากต้องการให้ข้อมูลเพิ่มเติมแก่ Assistant แอปของคุณจะต้องระบุบริบทแอปพลิเคชันส่วนกลางโดยการลงทะเบียนโปรแกรมฟังของแอป และระบุข้อมูลเฉพาะกิจกรรมด้วยคอลแบ็กของกิจกรรมดังที่แสดงในรูปที่ 3

รูปที่ 3 แผนภาพลำดับวงจรของ Assist API

แอปสร้างการใช้งาน Application.OnProvideAssistDataListener และลงทะเบียนโดยใช้ registerOnProvideAssistDataListener() เพื่อให้บริบททั้งหมดของแอปพลิเคชัน กิจกรรมจะลบล้าง onProvideAssistData() และ onProvideAssistContent() เพื่อให้ข้อมูลบริบทของแต่ละกิจกรรม ระบบจะเรียกวิธีกิจกรรมทั้ง 2 วิธีหลังจากมีการเรียกใช้ Callback ทั่วโลกที่ไม่บังคับ เนื่องจาก Callback จะทำงานในเทรดหลัก เทรดหลักจึงควรดำเนินการทันที ระบบจะเรียกใช้ Callback เมื่อกิจกรรมทำงานอยู่เท่านั้น

การให้บริบท

เมื่อผู้ใช้เปิดใช้งานผู้ช่วย ระบบจะเรียกใช้ onProvideAssistData() เพื่อสร้าง Intent ของ ACTION_ASSIST เต็มรูปแบบพร้อมด้วยบริบททั้งหมดของแอปพลิเคชันปัจจุบันที่แสดงเป็นอินสแตนซ์ของ AssistStructure คุณลบล้างเมธอดนี้เพื่อวางสิ่งใดก็ได้ที่ต้องการในแพ็กเกจเพื่อให้ปรากฏในส่วน EXTRA_ASSIST_CONTEXT ของ Intent ที่สนับสนุนได้

การอธิบายเนื้อหา

แอปของคุณสามารถใช้ onProvideAssistContent() เพื่อปรับปรุงประสบการณ์ของผู้ใช้ Assistant ด้วยการให้ข้อมูลอ้างอิงที่เกี่ยวข้องกับเนื้อหาซึ่งเกี่ยวข้องกับกิจกรรมปัจจุบัน คุณสามารถอธิบายเนื้อหาแอปโดยใช้คำศัพท์ทั่วไปที่ Schema.org กำหนดผ่านออบเจ็กต์ JSON-LD ในตัวอย่างด้านล่าง แอปเพลงมีข้อมูลที่มีโครงสร้างเพื่ออธิบายอัลบั้มเพลงที่ผู้ใช้กำลังดูอยู่

Kotlin

override fun onProvideAssistContent(assistContent: AssistContent) {
    super.onProvideAssistContent(assistContent)

    val structuredJson: String = JSONObject()
            .put("@type", "MusicRecording")
            .put("@id", "https://example.com/music/recording")
            .put("name", "Album Title")
            .toString()

    assistContent.structuredData = structuredJson
}

Java

@Override
public void onProvideAssistContent(AssistContent assistContent) {
  super.onProvideAssistContent(assistContent);

  String structuredJson = new JSONObject()
       .put("@type", "MusicRecording")
       .put("@id", "https://example.com/music/recording")
       .put("name", "Album Title")
       .toString();

  assistContent.setStructuredData(structuredJson);
}

นอกจากนี้ คุณยังปรับปรุงประสบการณ์ของผู้ใช้ด้วยการติดตั้งใช้งาน onProvideAssistContent() ที่กําหนดเองได้ ซึ่งจะมีประโยชน์ดังต่อไปนี้

  • ปรับความตั้งใจของเนื้อหาที่ระบุเพื่อสะท้อนบริบทระดับบนสุดของกิจกรรมได้ดียิ่งขึ้น
  • ระบุ URI ของเนื้อหาที่แสดง
  • เติมsetClipData()ด้วยเนื้อหาเพิ่มเติมที่น่าสนใจซึ่งผู้ใช้กำลังดูอยู่

หมายเหตุ: แอปที่ใช้การใช้งานการเลือกข้อความที่กำหนดเองอาจต้องติดตั้งใช้งาน onProvideAssistContent() และเรียกใช้ setClipData()

การใช้งานเริ่มต้น

หากไม่ได้ใช้ Callback onProvideAssistData() และ onProvideAssistContent() ระบบจะยังคงดำเนินการต่อและส่งข้อมูลที่เก็บรวบรวมโดยอัตโนมัติไปยัง Assistant เว้นแต่ว่าหน้าต่างปัจจุบันจะมีสถานะเป็นปลอดภัย ดังที่แสดงในรูปที่ 3 ระบบใช้การติดตั้งใช้งาน onProvideStructure() และ onProvideVirtualStructure() เริ่มต้นเพื่อรวบรวมข้อมูลลําดับชั้นของข้อความและมุมมอง หากมุมมองใช้การวาดข้อความที่กําหนดเอง ให้ลบล้าง onProvideStructure() เพื่อระบุข้อความที่แสดงต่อผู้ช่วยโดยเรียกใช้ setText(CharSequence)

ในกรณีส่วนใหญ่ การใช้การรองรับการช่วยเหลือพิเศษจะช่วยให้ผู้ช่วยได้รับข้อมูลที่จําเป็น หากต้องการใช้การรองรับการช่วยเหลือพิเศษ ให้ทําตามแนวทางปฏิบัติแนะนำที่อธิบายไว้ในการทําให้แอปพลิเคชันเข้าถึงได้ ซึ่งรวมถึงสิ่งต่อไปนี้

  • ระบุแอตทริบิวต์ android:contentDescription
  • ป้อนข้อมูล AccessibilityNodeInfo สำหรับมุมมองที่กำหนดเอง
  • ตรวจสอบว่าออบเจ็กต์ ViewGroup ที่กำหนดเองแสดงรายการย่อยอย่างถูกต้อง

การยกเว้นยอดดูจากผู้ช่วย

หากต้องการจัดการข้อมูลที่ละเอียดอ่อน แอปของคุณจะยกเว้นมุมมองปัจจุบันจาก Assistant ได้ด้วยการกําหนดพารามิเตอร์การจัดวาง FLAG_SECURE ของ WindowManager คุณต้องตั้งค่า FLAG_SECURE อย่างชัดเจนสำหรับทุกหน้าต่างที่กิจกรรมสร้างขึ้น รวมถึงกล่องโต้ตอบ แอปยังใช้ setSecure() เพื่อยกเว้นแพลตฟอร์มจาก Assistant ได้ด้วย ทั้งนี้ ไม่มีกลไกส่วนกลาง (ระดับแอป) ที่จะยกเว้นการดูทั้งหมดจาก Assistant โปรดทราบว่า FLAG_SECURE จะไม่ทำให้การเรียกกลับของ Assist API หยุดทำงาน กิจกรรมที่ใช้ FLAG_SECURE จะยังคงให้ข้อมูลแก่แอปผู้ช่วยได้อย่างชัดเจนโดยใช้การเรียกกลับที่อธิบายไว้ก่อนหน้านี้ในคู่มือนี้

หมายเหตุ: สำหรับบัญชีองค์กร (Android for Work) ผู้ดูแลระบบสามารถปิดใช้การเก็บรวบรวมข้อมูลผู้ช่วยสำหรับโปรไฟล์งานได้โดยใช้เมธอด setScreenCaptureDisabled() ของ DevicePolicyManager API

การโต้ตอบด้วยเสียง

นอกจากนี้ ระบบจะเรียกใช้การเรียกกลับของ Assist API เมื่อตรวจพบวลี สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบ การสั่งงานด้วยเสียง

ข้อควรพิจารณาเกี่ยวกับลําดับ Z

Assistant ใช้หน้าต่างวางซ้อนน้ำหนักเบา โดยแสดงทับกิจกรรมปัจจุบัน เนื่องจากผู้ใช้เปิดใช้งาน Assistant ได้ทุกเมื่อ คุณจึงไม่ควรสร้างหน้าต่างการแจ้งเตือนของระบบแบบถาวรที่รบกวนหน้าต่างวางซ้อน ดังที่แสดงในรูปที่ 4

รูปที่ 4 Z-order ในเลเยอร์สนับสนุน

หากแอปใช้หน้าต่างการแจ้งเตือนของระบบ ให้นำหน้าต่างดังกล่าวออกทันที เนื่องจากการแสดงหน้าต่างดังกล่าวบนหน้าจอจะทำให้ประสบการณ์ของผู้ใช้แย่ลง

แอปปลายทาง

แอป Assistant มักจะใช้ประโยชน์จากการทำ Deep Link เพื่อค้นหาแอปปลายทาง หากต้องการทำให้ แอปเป็นแอปปลายทางที่เป็นไปได้ ให้พิจารณาเพิ่มการรองรับการทำ Deep Link การจับคู่ระหว่างบริบทของผู้ใช้ปัจจุบันกับ Deep Link หรือการดำเนินการอื่นๆ ที่อาจเกิดขึ้นซึ่งแสดงในหน้าต่างวางซ้อน (แสดงในขั้นตอนที่ 3 ในรูปที่ 1) จะใช้ได้เฉพาะกับการใช้งาน Google Assistant ตัวอย่างเช่น แอป Google Assistant ใช้การทำ Deep Link และ App Link เพื่อกระตุ้นการเข้าชมแอปปลายทาง

ใช้งาน Assistant ของคุณเอง

คุณอาจต้องการใช้ผู้ช่วยของคุณเอง ดังที่แสดงในรูปภาพ 2 ผู้ใช้สามารถเลือกแอปผู้ช่วยที่ใช้งานอยู่ แอปผู้ช่วยต้องใช้งาน VoiceInteractionSessionService และ VoiceInteractionSession ตามที่แสดงในVoiceInteractionตัวอย่างนี้ นอกจากนี้ ยังต้องมีสิทธิ์ BIND_VOICE_INTERACTION ด้วย จากนั้น Assistant จะได้รับข้อความและมุมมองต้นไม้ซึ่งแสดงเป็นอินสแตนซ์ของ AssistStructure ใน onHandleAssist() โดยจะได้รับภาพหน้าจอผ่าน onHandleScreenshot()