ฟีเจอร์แตะเพื่ออ่านของ Assistant

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 รายการต่อไปนี้
  • 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 อ่านข้อความออกเสียงให้ผู้ใช้ฟัง แล้วเรียกใช้ 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

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 กล่าวว่า...") ให้สร้างฟังก์ชันดังที่แสดงในตัวอย่างโค้ดต่อไปนี้เพื่อให้แน่ใจว่าผู้ช่วยกำลังอ่านชื่อที่ถูกต้อง

@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;
}