Android Automotive ถือว่าเสียงเป็นองค์ประกอบสําคัญ
การโต้ตอบที่ปลอดภัยต่อไดรฟ์และหนึ่งในวิธีที่ปลอดภัยที่สุดสำหรับผู้ใช้
โต้ตอบกับ Android Automotive OS ขณะขับรถ ด้วยเหตุนี้ เราจึงได้ขยาย
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
สำหรับแต่ละชั้นเรียนจะแสดงในตารางต่อไปนี้
เซสชันการโต้ตอบของ CarVoice | เซสชันการโต้ตอบด้วยเสียง |
---|---|
onShow ใช้พารามิเตอร์3 รายการต่อไปนี้
|
onShow ใช้พารามิเตอร์ 2 รายการต่อไปนี้
|
การเปลี่ยนแปลงใน 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 ของ Intent ที่รอดำเนินการ แล้วให้แท็กเริ่มทำงาน
Intent ที่รอดำเนินการ |
VOICE_ACTION_HANDLE_EXCEPTION |
สตริงที่มีคีย์KEY_EXCEPTION
ที่แมปกับ ExceptionValue
(อธิบายไว้ในค่าข้อยกเว้น)KEY_FALLBACK_ASSISTANT_ENABLED ที่แมปกับค่าบูลีน หากค่า
คือ true ผู้ช่วยสำรองที่จัดการคำขอของผู้ใช้ได้
ปิดใช้อยู่ |
การดำเนินการที่คาดว่าจะต้องทำสำหรับข้อยกเว้นนี้มีระบุไว้ใน สำหรับข้อยกเว้นดังกล่าว |
ค่าข้อยกเว้น
EXCEPTION_NOTIFICATION_LISTENER_PERMISSIONS_MISSING
บอกผู้ช่วยเสียงว่าไม่มีสิทธิ์ Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE
และรับสิทธิ์นี้จากผู้ใช้
ขอสิทธิ์ตัวฟังการแจ้งเตือน
หากผู้ช่วยเสียงเริ่มต้นไม่มีตัวฟังการแจ้งเตือน
FallbackAssistant
ของแพลตฟอร์ม
(ถ้าผู้ผลิตรถยนต์เปิดใช้) อาจอ่านออกเสียงข้อความก่อนที่ผู้ช่วยแบบเสียง
ได้รับแจ้งเพื่อขอสิทธิ์ หากต้องการตรวจสอบว่าเปิดใช้ FallbackAssistant
หรือไม่ และ
ได้อ่านข้อความแล้ว ผู้ช่วยแบบเสียงควรตรวจสอบ
KEY_FALLBACK_ASSISTANT_ENABLED
ค่าบูลีนในเพย์โหลด
แพลตฟอร์มนี้แนะนำให้ใช้ตรรกะการจำกัดอัตราการเพิ่มผู้ช่วยที่เป็นเสียงสำหรับ
จำนวนครั้งที่มีการขอสิทธิ์นี้ ซึ่งการทำเช่นนี้จะเคารพผู้ใช้ที่ไม่
ต้องการให้สิทธิ์นี้แก่ผู้ช่วยแบบเสียง และต้องการใช้
FallbackAssistant
เพื่ออ่านออกเสียง SMS พรอมต์
ขออนุญาตทุกครั้งที่ผู้ใช้กดเล่นการแจ้งเตือนข้อความ
อาจทำให้ผู้ใช้ได้รับประสบการณ์ในแง่ลบ แพลตฟอร์มจะไม่กำหนดขีดจำกัดอัตราคำขอ
ในนามของผู้ช่วยแบบเสียง
เมื่อขอสิทธิ์ตัวฟังการแจ้งเตือน ผู้ช่วยแบบเสียงควร
ใช้ CarUxRestrictionsManager
เพื่อระบุว่าผู้ใช้จอดรถหรือขับรถอยู่ หากผู้ใช้กำลังขับรถ เสียงผู้ช่วย
แสดงการแจ้งเตือนพร้อมวิธีการให้สิทธิ์ ดังนั้น
ช่วย (และเตือน) ผู้ใช้ให้อนุญาตเมื่อปลอดภัยกว่า
ทำงานกับ StatusBarNotification
ผ่านการทดสอบ StatusBarNotification
ด้วยสถานะอ่านและตอบกลับ
การสั่งงานด้วยเสียงจะอยู่ในการแจ้งเตือนการรับส่งข้อความที่ใช้ได้กับรถยนต์เสมอตามที่อธิบายไว้
ใน แจ้งเตือน
ผู้ใช้ข้อความ การแจ้งเตือนบางรายการอาจไม่ได้แสดงว่าการตอบกลับอยู่ระหว่างดำเนินการ
Intent ทั้งหมดมี Intent ที่รอดำเนินการ "ทำเครื่องหมายว่าอ่านแล้ว"
หากต้องการเพิ่มประสิทธิภาพการโต้ตอบกับการแจ้งเตือน ให้ใช้ NotificationPayloadHandler
ซึ่งจะบอกวิธีดึงข้อความจากการแจ้งเตือนและเขียน
ตอบกลับข้อความไปยังเจตนาที่รอดำเนินการที่เหมาะสมของการแจ้งเตือน หลังจาก
เสียงผู้ช่วยจะอ่านข้อความ ผู้ช่วยแบบเสียงต้องทำให้มาร์กเริ่มทำงาน
เป็นความตั้งใจในการอ่าน
เป็นไปตามเงื่อนไขล่วงหน้าสำหรับ "แตะเพื่ออ่าน"
เพียง VoiceInteractionSession
ของเสียงเริ่มต้น
Assistant จะได้รับแจ้งเมื่อผู้ใช้เรียกให้การสั่งงานด้วยเสียงอ่านและ
ตอบกลับข้อความ ดังที่กล่าวไว้ข้างต้น ผู้ช่วยเสียงเริ่มต้นนี้จะต้อง
มีสิทธิ์ตัวฟังการแจ้งเตือน
แผนภาพลำดับ
ตัวเลขเหล่านี้แสดงขั้นตอนเชิงตรรกะของ CarVoiceInteractionSession actions
รูปที่ 2 แผนภาพลำดับสำหรับ VOICE_ACTION_READ_NOTIFICATION
ในกรณีของรูปที่ 3 ขอแนะนำให้ใช้แอปที่มีขีดจำกัดอัตราคำขอสิทธิ์ ดังนี้
รูปที่ 3 แผนภาพลำดับสำหรับ VOICE_ACTION_REPLY_NOTIFICATION
รูปที่ 4 แผนภาพลำดับสำหรับ VOICE_ACTION_HANDLE_EXCEPTION
อ่านชื่อแอป
ถ้าต้องการให้ผู้ช่วยแบบเสียงอ่านชื่อของแอปรับส่งข้อความ การอ่านข้อความ (ตัวอย่างเช่น "Sam จาก Hangouts พูดว่า...") สร้างฟังก์ชันแบบที่แสดง ในตัวอย่างโค้ดต่อไปนี้เพื่อให้แน่ใจว่า Assistant จะอ่านชื่อที่ถูกต้อง
@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; }