Android Automotive ถือว่าเสียงเป็นองค์ประกอบสำคัญสำหรับการโต้ตอบอย่างปลอดภัยในการขับขี่ และเป็นหนึ่งในวิธีที่ปลอดภัยที่สุดสำหรับผู้ใช้ในการโต้ตอบกับระบบปฏิบัติการ Android Automotive ในขณะขับรถ ด้วยเหตุนี้ เราจึงขยาย API ผู้ช่วยเสียงของ Android (รวมถึง VoiceInteractionSession
) เพื่อให้ผู้ช่วยเสียงสามารถทำงานต่างๆ ให้กับผู้ใช้ที่อาจทำได้ยากในขณะขับรถ
แตะเพื่ออ่าน ช่วยให้ผู้ช่วยเสียงสามารถอ่านและตอบกลับข้อความในนามของผู้ใช้ เมื่อผู้ใช้โต้ตอบกับการแจ้งเตือนข้อความ เพื่อให้มีฟังก์ชันนี้ คุณสามารถรวมระบบช่วยเหลือแบบเสียงเข้ากับ CarVoiceInteractionSession
ได้
ในยานยนต์ การแจ้งเตือนที่โพสต์ไปยังศูนย์การแจ้งเตือนที่ระบุว่าเป็น INBOX
หรือ INBOX_IN_GROUP
(เช่น ข้อความ SMS) จะมีปุ่ม เล่น ด้วย ผู้ใช้สามารถคลิก เล่น เพื่อให้ผู้ช่วยเสียงที่เลือกอ่านออกเสียงการแจ้งเตือน และเลือกที่จะตอบกลับด้วยเสียงได้
รูปที่ 1 การแจ้งเตือนแบบแตะเพื่ออ่านด้วยปุ่มเล่น
ผสานรวมกับ CarVoiceInteractionSession
ส่วนถัดไปจะอธิบายวิธีผสานรวมผู้ช่วยแบบเสียงเข้ากับ CarVoiceInteractionSession
รองรับการโต้ตอบด้วยเสียง
แอปที่ให้บริการโต้ตอบด้วยเสียงของรถยนต์ จะต้อง ผสานรวมกับการโต้ตอบด้วยเสียงของ Android ที่มีอยู่ หากต้องการเรียนรู้เพิ่มเติม โปรดดูที่ Google Assistant สำหรับ Android (ยกเว้น VoiceInteractionSession
) แม้ว่าองค์ประกอบ API การโต้ตอบด้วยเสียงทั้งหมดจะยังคงเหมือนเดิมกับที่ใช้งานบนอุปกรณ์เคลื่อนที่ แต่ CarVoiceInteractionSession
(อธิบายไว้ใน Implement CarVoiceInteractionSession ) จะแทนที่ VoiceInteractionSession
สำหรับข้อมูลเพิ่มเติม โปรดดูหน้าเหล่านี้:
ใช้ CarVoiceInteractionSession
CarVoiceInteractionSession
เปิดเผย API ที่คุณสามารถใช้เพื่อเปิดใช้งานผู้ช่วยเสียงเพื่ออ่านข้อความตัวอักษรออกเสียงแล้วตอบกลับข้อความเหล่านี้ในนามของผู้ใช้
ข้อแตกต่างที่สำคัญระหว่างคลาส CarVoiceInteractionSession
และ VoiceInteractionSession
คือ CarVoiceInteractionSession
จะส่งผ่านการดำเนินการใน onShow
เพื่อให้ผู้ช่วยเสียงสามารถตรวจจับบริบทของคำขอของผู้ใช้ได้ทันทีที่ CarVoiceInteractionSession
เริ่มเซสชัน พารามิเตอร์สำหรับ onShow
สำหรับแต่ละคลาสแสดงอยู่ในตารางต่อไปนี้:
เซสชันการโต้ตอบด้วยเสียงของรถยนต์ | เซสชันการโต้ตอบด้วยเสียง |
---|---|
onShow รับพารามิเตอร์ทั้ง สาม นี้:
| onShow รับพารามิเตอร์ทั้ง สอง นี้:
|
การเปลี่ยนแปลงใน Android 10
ตั้งแต่ Android 10 เป็นต้นไป แพลตฟอร์มจะเรียกใช้ VoiceInteractionService.onGetSupportedVoiceActions
เพื่อตรวจสอบว่าการทำงานใดบ้างที่รองรับ ผู้ช่วยเสียงจะแทนที่และใช้งาน VoiceInteractionService.onGetSupportedVoiceActions
ดังที่แสดงในตัวอย่างต่อไปนี้:
public class MyInteractionService extends VoiceInteractionService { private static final ListSUPPORTED_VOICE_ACTIONS = Arrays.asList( CarVoiceInteractionSession.VOICE_ACTION_READ_NOTIFICATION); @Override public Set onGetSupportedVoiceActions(@NonNull Set voiceActions) { Set result = new HashSet<>(voiceActions); result.retainAll(SUPPORTED_VOICE_ACTIONS); return result; } }
การดำเนินการที่ถูกต้องอธิบายไว้ในตารางต่อไปนี้ สำหรับรายละเอียดเกี่ยวกับแต่ละการกระทำ โปรดดู แผนภาพลำดับ
การกระทำ | เพย์โหลดที่คาดหวัง | การดำเนินการโต้ตอบด้วยเสียงที่คาดหวัง |
---|---|---|
VOICE_ACTION_READ_NOTIFICATION | อ่านข้อความให้ผู้ใช้ฟัง จากนั้นจึงเริ่มการทำเครื่องหมายว่าอ่านแล้วโดยรอดำเนินการกลับมาเมื่ออ่านข้อความได้สำเร็จ หรือแจ้งผู้ใช้ให้ตอบกลับ | |
VOICE_ACTION_REPLY_NOTIFICATION | พัสดุพร้อมกุญแจKEY_NOTIFICATION ที่จับคู่กับ StatusBarNotification ต้องใช้ android.permission.BIND_NOTIFICATION_LISTENER_SERVICE | พร้อมท์ให้ผู้ใช้ระบุข้อความตอบกลับ ป้อนข้อความตอบกลับลงใน RemoteInputReply ของเจตนาที่ค้างอยู่ จากนั้นจึงเริ่มการทำงานของเจตนาที่ค้างอยู่ |
VOICE_ACTION_HANDLE_EXCEPTION | ร้อยด้วยกุญแจKEY_EXCEPTION ที่แมปกับ ExceptionValue (อธิบายไว้ใน ค่า Exception )KEY_FALLBACK_ASSISTANT_ENABLED ที่แมปกับค่าบูลีน หากค่าเป็น true แสดงว่าผู้ช่วยสำรองที่สามารถจัดการคำขอของผู้ใช้ถูกปิดใช้งาน | การดำเนินการที่คาดหวังที่จะดำเนินการสำหรับข้อยกเว้นถูกกำหนดไว้ในเอกสารประกอบสำหรับข้อยกเว้น |
ค่าข้อยกเว้น
EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
บ่งบอกให้ผู้ช่วยเสียงทราบว่าไม่มีสิทธิ์ Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
และต้องรับสิทธิ์นี้จากผู้ใช้
ขออนุญาตผู้ฟังการแจ้งเตือน
หากผู้ช่วยเสียงเริ่มต้นไม่มีสิทธิ์ในการฟังการแจ้งเตือน FallbackAssistant
ของแพลตฟอร์ม (หากเปิดใช้งานโดยผู้ผลิตรถยนต์) อาจอ่านข้อความออกเสียงก่อนที่ผู้ช่วยเสียงจะได้รับแจ้งเพื่อขออนุญาต เพื่อตรวจสอบว่า FallbackAssistant
เปิดใช้งานอยู่และได้อ่านข้อความแล้ว ผู้ช่วยเสียงควรตรวจสอบค่าบูลีน KEY_FALLBACK_ASSISTANT_ENABLED
ในเพย์โหลด
แพลตฟอร์มแนะนำให้ผู้ช่วยเสียงเพิ่มตรรกะการจำกัดอัตราตามจำนวนครั้งที่ร้องขอการอนุญาตนี้ การทำเช่นนี้เป็นการเคารพผู้ใช้ที่ไม่ต้องการให้สิทธิ์แก่ผู้ช่วยเสียง และต้องการให้ FallbackAssistant
อ่านออกเสียงข้อความ การแจ้งผู้ใช้ให้อนุญาตทุกครั้งที่ผู้ใช้กด Play ในการแจ้งเตือนข้อความอาจทำให้ผู้ใช้ได้รับประสบการณ์เชิงลบ แพลตฟอร์มไม่ได้จำกัดอัตราในนามของผู้ช่วยเสียง
เมื่อขออนุญาตผู้ฟังการแจ้งเตือน ผู้ช่วยเสียงควรใช้ CarUxRestrictionsManager
เพื่อตรวจสอบว่าผู้ใช้จอดรถหรือกำลังขับรถอยู่ หากผู้ใช้กำลังขับรถ ระบบสั่งงานด้วยเสียงจะแสดงการแจ้งเตือนที่ให้คำแนะนำเกี่ยวกับวิธีการให้สิทธิ์ การทำเช่นนี้จะช่วย (และเตือน) ผู้ใช้ให้อนุญาตเมื่อปลอดภัยยิ่งขึ้น
ทำงานกับ StatusBarNotification
StatusBarNotification
ที่ส่งผ่านด้วยเสียงอ่านและตอบกลับจะอยู่ในการแจ้งเตือนข้อความที่ใช้งานร่วมกันได้กับรถยนต์เสมอ ตามที่อธิบายไว้ใน แจ้งผู้ใช้ข้อความ แม้ว่าการแจ้งเตือนบางอย่างอาจไม่มีเจตนาตอบกลับที่รอดำเนินการ แต่การแจ้งเตือนทั้งหมดมีเจตนาที่รอการตอบกลับว่าอ่านแล้ว
หากต้องการปรับปรุงการโต้ตอบกับการแจ้งเตือน ให้ใช้ NotificationPayloadHandler
ซึ่งมีวิธีการดึงข้อความจากการแจ้งเตือนและเขียนข้อความตอบกลับไปยังจุดประสงค์ที่รอดำเนินการที่เหมาะสมของการแจ้งเตือน หลังจากที่ผู้ช่วยเสียงอ่านข้อความแล้ว ผู้ช่วยเสียง จะต้อง เริ่มการทำเครื่องหมายว่าอ่านแล้ว
ปฏิบัติตามเงื่อนไขเบื้องต้นของการแตะเพื่ออ่าน
เฉพาะ VoiceInteractionSession
ของผู้ช่วยเสียงเริ่มต้นเท่านั้นที่จะได้รับการแจ้งเตือนเมื่อผู้ใช้ทริกเกอร์การสั่งงานด้วยเสียงเพื่ออ่านและตอบกลับข้อความ ตามที่กล่าวไว้ข้างต้น ผู้ช่วยเสียงเริ่มต้นนี้จะต้องมีสิทธิ์ฟังการแจ้งเตือนด้วย
แผนภาพลำดับ
ตัวเลขเหล่านี้แสดงโฟลว์ตรรกะของ CarVoiceInteractionSession actions
:
รูปที่ 2 แผนภาพลำดับสำหรับ VOICE_ACTION_READ_NOTIFICATION
ในกรณีของรูปที่ 3 แนะนำให้ใช้แอปจำกัดอัตราคำขอสิทธิ์:
รูปที่ 3 แผนภาพลำดับสำหรับ VOICE_ACTION_REPLY_NOTIFICATION
รูปที่ 4 แผนภาพลำดับสำหรับ VOICE_ACTION_HANDLE_EXCEPTION
อ่านชื่อแอป
หากคุณต้องการให้ผู้ช่วยเสียงของคุณอ่านออกเสียงชื่อแอปรับส่งข้อความระหว่างการอ่านข้อความ (เช่น "แซมจากแฮงเอาท์บอกว่า...") ให้สร้างฟังก์ชันแบบที่แสดงในตัวอย่างโค้ดต่อไปนี้เพื่อให้แน่ใจว่าผู้ช่วยกำลังอ่านข้อความ ชื่อที่ถูกต้อง:
@Nullable String getMessageApplicationName(Context context, StatusBarNotification statusBarNotification) { ApplicationInfo info = getApplicationInfo(context, statusBarNotification.getPackageName()); if (info == null) return null; Notification notification = statusBarNotification.getNotification(); // Sometimes system packages will post on behalf of other apps, so check this // field for a system app notification. if (isSystemApp(info) && notification.extras.containsKey(Notification.EXTRA_SUBSTITUTE_APP_NAME)) { return notification.extras.getString(Notification.EXTRA_SUBSTITUTE_APP_NAME); } else { PackageManager pm = context.getPackageManager(); return String.valueOf(pm.getApplicationLabel(info)); } } @Nullable ApplicationInfo getApplicationInfo(Context context, String packageName) { final PackageManager pm = context.getPackageManager(); ApplicationInfo info; try { info = pm.getApplicationInfo(packageName, 0); } catch (PackageManager.NameNotFoundException e) { return null; } return info; } boolean isSystemApp(ApplicationInfo info) { return (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; }