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)
ผู้ใช้สามารถกำหนดค่าผู้ช่วยได้โดยเลือกการตั้งค่า > แอป > แอปเริ่มต้น > ผู้ช่วยและการป้อนข้อมูลด้วยเสียง ผู้ใช้จะเปลี่ยนตัวเลือกของระบบได้ เช่น การเข้าถึงเนื้อหาบนหน้าจอเป็นข้อความและการเข้าถึงภาพหน้าจอดังที่แสดงในรูปที่ 2
แอปต้นทาง
คุณเพียงต้องทําตามแนวทางปฏิบัติแนะนำด้านการช่วยเหลือพิเศษเพื่อให้แอปทำงานร่วมกับผู้ช่วยเป็นแหล่งข้อมูลของผู้ใช้ ส่วนนี้อธิบายวิธีให้ข้อมูลเพิ่มเติมเพื่อช่วยปรับปรุงประสบการณ์ของผู้ใช้ Assistant รวมถึงสถานการณ์ที่ต้องมีการจัดการพิเศษ เช่น มุมมองที่กำหนดเอง
แชร์ข้อมูลเพิ่มเติมกับ Assistant
นอกเหนือจากข้อความและภาพหน้าจอแล้ว แอปยังแชร์ข้อมูลอื่นๆ กับ Assistant ได้ด้วย ตัวอย่างเช่น แอปเพลงอาจเลือกส่งข้อมูลอัลบั้มปัจจุบันเพื่อให้ Assistant แนะนำการดำเนินการที่ชาญฉลาดยิ่งขึ้นซึ่งปรับให้เหมาะกับกิจกรรมปัจจุบัน โปรดทราบว่า Assist API ไม่ได้ให้การควบคุมสื่อ หากต้องการเพิ่มการควบคุมสื่อ ให้ดูที่ Google Assistant และแอปสื่อ
หากต้องการให้ข้อมูลเพิ่มเติมแก่ Assistant แอปของคุณจะต้องระบุบริบทแอปพลิเคชันส่วนกลางโดยการลงทะเบียนโปรแกรมฟังของแอป และระบุข้อมูลเฉพาะกิจกรรมด้วยคอลแบ็กของกิจกรรมดังที่แสดงในรูปที่ 3
แอปสร้างการใช้งาน 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
หากแอปใช้หน้าต่างการแจ้งเตือนของระบบ ให้นำหน้าต่างดังกล่าวออกทันที เนื่องจากการแสดงหน้าต่างดังกล่าวบนหน้าจอจะทำให้ประสบการณ์ของผู้ใช้แย่ลง
แอปปลายทาง
แอป 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()