ผู้ช่วยเสียงแตะเพื่ออ่าน

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 รับพารามิเตอร์ทั้ง สาม นี้:
  • args
  • showFlags
  • actions
onShow รับพารามิเตอร์ทั้ง สอง นี้:
  • args
  • showFlags

การเปลี่ยนแปลงใน Android 10

ตั้งแต่ Android 10 เป็นต้นไป แพลตฟอร์มจะเรียกใช้ VoiceInteractionService.onGetSupportedVoiceActions เพื่อตรวจสอบว่าการทำงานใดบ้างที่รองรับ ผู้ช่วยเสียงจะแทนที่และใช้งาน VoiceInteractionService.onGetSupportedVoiceActions ดังที่แสดงในตัวอย่างต่อไปนี้:

public class MyInteractionService extends VoiceInteractionService {
    private static final List SUPPORTED_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 :

VOICE_ACTION_READ_NOTIFICATION

รูปที่ 2 แผนภาพลำดับสำหรับ VOICE_ACTION_READ_NOTIFICATION

ในกรณีของรูปที่ 3 แนะนำให้ใช้แอปจำกัดอัตราคำขอสิทธิ์:

VOICE_ACTION_REPLY_การแจ้งเตือน

รูปที่ 3 แผนภาพลำดับสำหรับ VOICE_ACTION_REPLY_NOTIFICATION

VOICE_ACTION_HANDLE_EXCEPTION

รูปที่ 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;
}