Android Automotive ถือว่าเสียงเป็นองค์ประกอบสำคัญสำหรับการโต้ตอบที่ปลอดภัยขณะขับรถ และเป็นวิธีหนึ่งที่ปลอดภัยที่สุดสำหรับผู้ใช้ในการโต้ตอบกับ Android Automotive OS ขณะขับรถ ด้วยเหตุนี้ เราจึงขยายการให้บริการ API ของ Assistant เสียงของ Android (รวมถึง VoiceInteractionSession
) เพื่อช่วยให้ Assistant เสียงสามารถทำงานต่างๆ ให้กับผู้ใช้ได้ ซึ่งอาจทำได้ยากขณะขับรถ
แตะเพื่ออ่านช่วยให้ผู้ช่วยเสียงอ่านและตอบกลับข้อความแทนผู้ใช้ได้เมื่อผู้ใช้โต้ตอบกับการแจ้งเตือนข้อความ หากต้องการใช้ฟังก์ชันการทำงานนี้ คุณสามารถผสานรวมผู้ช่วยเสียงเข้ากับ CarVoiceInteractionSession
ได้
ใน Automotive การแจ้งเตือนที่โพสต์ไปยังศูนย์การแจ้งเตือนซึ่งระบุเป็น INBOX
หรือ INBOX_IN_GROUP
(เช่น ข้อความ SMS) จะมีปุ่มเล่น ผู้ใช้สามารถคลิกเล่นเพื่อให้ผู้ช่วยเสียงที่เลือกอ่านการแจ้งเตือนออกเสียง และตอบกลับด้วยเสียงได้ (ไม่บังคับ)
รูปที่ 1 การแจ้งเตือนแบบแตะเพื่ออ่านพร้อมปุ่มเล่น
ผสานรวมกับ CarVoiceInteractionSession
ส่วนถัดไปจะอธิบายวิธีผสานรวมผู้ช่วยเสียงกับ
CarVoiceInteractionSession
รองรับการโต้ตอบด้วยเสียง
แอปที่ให้บริการโต้ตอบด้วยเสียงในรถยนต์ต้องผสานรวมกับการโต้ตอบด้วยเสียงของ Android ที่มีอยู่ ดูข้อมูลเพิ่มเติมได้ที่ Google Assistant สําหรับ Android (ยกเว้น VoiceInteractionSession
) แม้ว่าองค์ประกอบ API การโต้ตอบด้วยเสียงทั้งหมดจะยังคงเหมือนเดิมกับที่ใช้ในอุปกรณ์เคลื่อนที่ แต่ CarVoiceInteractionSession
(อธิบายไว้ในการใช้ CarVoiceInteractionSession) จะแทนที่ VoiceInteractionSession
ดูข้อมูลเพิ่มเติมได้ที่หน้าต่อไปนี้
ใช้ CarVoiceInteractionSession
CarVoiceInteractionSession
แสดง API ที่คุณสามารถใช้เพื่อเปิดใช้ผู้ช่วยเสียงในการอ่าน SMS ออกเสียง แล้วตอบกลับข้อความเหล่านั้นในนามของผู้ใช้
ความแตกต่างที่สำคัญระหว่างคลาส CarVoiceInteractionSession
กับ VoiceInteractionSession
คือ CarVoiceInteractionSession
จะส่งการดำเนินการใน onShow
เพื่อให้ผู้ช่วยเสียงตรวจจับบริบทของคำขอของผู้ใช้ได้ทันทีที่ CarVoiceInteractionSession
เริ่มเซสชัน พารามิเตอร์สำหรับ onShow
สำหรับแต่ละคลาสแสดงอยู่ในตารางต่อไปนี้
CarVoiceInteractionSession | VoiceInteractionSession |
---|---|
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 |
อ่านข้อความออกเสียงให้ผู้ใช้ฟัง แล้วเรียกใช้ Intent "รอดำเนินการทำเครื่องหมายเป็นอ่านแล้ว" อีกครั้งเมื่ออ่านข้อความเรียบร้อยแล้ว แจ้งให้ผู้ใช้ตอบกลับหรือไม่ก็ได้ | |
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
ที่ส่งผ่านพร้อมกับการดำเนินการด้วยเสียงของ Read และ Reply จะอยู่ในการแจ้งเตือนการรับส่งข้อความที่เข้ากันได้กับรถยนต์เสมอตามที่อธิบายไว้ในการแจ้งเตือนผู้ใช้เกี่ยวกับข้อความ แม้ว่าการแจ้งเตือนบางรายการอาจไม่มี Intent ของ "รอการตอบกลับ" แต่การแจ้งเตือนทั้งหมดจะมี Intent ของ "รอทำเครื่องหมายว่าอ่านแล้ว"
หากต้องการเพิ่มประสิทธิภาพการโต้ตอบกับการแจ้งเตือน ให้ใช้ NotificationPayloadHandler
ซึ่งมีวิธีการดึงข้อความจากการแจ้งเตือนและเขียนข้อความตอบไปยัง Intent ที่รอดำเนินการที่เหมาะสมของการแจ้งเตือน หลังจากที่ผู้ช่วยเสียงอ่านข้อความแล้ว ผู้ช่วยเสียงต้องเรียกใช้ Intent "ทําเครื่องหมายว่าอ่านแล้ว"
มีคุณสมบัติตรงตามเงื่อนไขเบื้องต้นของแตะเพื่ออ่าน
เฉพาะผู้ช่วยเสียงเริ่มต้น VoiceInteractionSession
คนเท่านั้นที่จะได้รับการแจ้งเตือนเมื่อผู้ใช้เรียกใช้การดำเนินการด้วยเสียงเพื่ออ่านและตอบกลับข้อความ ดังที่กล่าวไว้ข้างต้น บริการเสียงผู้ช่วยเริ่มต้นนี้ต้องมีสิทธิ์ผู้ฟังการแจ้งเตือนด้วย
แผนภาพลำดับ
ตัวเลขเหล่านี้แสดงลําดับตรรกะของ CarVoiceInteractionSession actions
รูปที่ 2 ผังลำดับขั้นสำหรับ VOICE_ACTION_READ_NOTIFICATION
ในกรณีของรูปที่ 3 เราขอแนะนำให้แอปใช้การจำกัดอัตราคำขอสิทธิ์ดังนี้
รูปที่ 3 ผังลำดับขั้นสำหรับ VOICE_ACTION_REPLY_NOTIFICATION
รูปที่ 4 ผังลำดับสำหรับ VOICE_ACTION_HANDLE_EXCEPTION
อ่านชื่อแอป
หากต้องการให้ผู้ช่วยเสียงอ่านชื่อแอปรับส่งข้อความออกเสียงระหว่างการอ่านข้อความ (เช่น "Sam จาก Hangouts กล่าวว่า...") ให้สร้างฟังก์ชันดังที่แสดงในตัวอย่างโค้ดต่อไปนี้เพื่อให้แน่ใจว่าผู้ช่วยกำลังอ่านชื่อที่ถูกต้อง
@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; }