ฟีเจอร์แตะเพื่ออ่านของผู้ช่วยเสียง

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 รายการต่อไปนี้
  • args
  • showFlags
  • actions
onShow ใช้พารามิเตอร์ 2 รายการต่อไปนี้
  • 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 ของ 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

VOICE_ACTION_READ_NOTIFICATION

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

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

VOICE_ACTION_REPLY_NOTIFICATION

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

VOICE_ACTION_HANDLE_EXCEPTION

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