שליח לרכב

Car Messenger מציעה יכולות של העברת הודעות שמיועדות למכשירים של כלי רכב. בדומה לאפליקציות אחרות לרכב, המשתמשים מפעילים את Car Messenger ממרכז האפליקציות.

מה חדש ב-Car Messenger?

עם אפליקציית Car Messenger החדשה, הנהגים:

  • רוצה לקבל חוויה ייעודית להעברת הודעות?
  • מפעילים את Car Messenger ממרכז האפליקציות.
  • לעיין בהודעות שהתקבלו לפני הנסיעה ובמהלכה.
  • להאזין להודעות ולענות להן בשרשור.
  • להשתיק את ההתראות על הודעות.
  • להתחיל שיחות חדשות.

טרמינולוגיה

המונחים הבאים משמשים בדף הזה:

הקראה (TTR)
התכונה 'הקשה לקריאה' מאפשרת לעוזרים הקוליים לקרוא ולהשיב ל הודעות טקסט בשם שהמשתמש מקיים אינטראקציה עם התראות על הודעות.

תשובה ישירה
דומה לתכונה 'מצמידים ומשלמים', אבל האסיסטנט לא מקריא את ומיד שולחת בקשה לתשובה.

שליחה ישירה
פועל בשילוב עם עוזר דיגיטלי כדי לכתוב הודעה חדשה ברצף עם או בלי איש קשר מסוים.

היתרונות של אפליקציות לא מקובצות

אפליקציות שאינן מקובצות, כמו Car Messenger, מספקות את היתרונות הבאים:

  • משתמשת ב-methods ציבוריות בלבד (ללא יחסי תלות של פלטפורמות בממשקי API נסתרים)
  • פיתוח אפליקציות מחוץ לפלטפורמת Android
  • הפעלת גרסאות בתדירות גבוהה יותר (לתכונות חדשות ולבעיות שתוקנו)
  • עדכון אפליקציות דרך Google Play

למידע נוסף על אפליקציות לא בחבילה

פרטים טכניים

בקטע הזה מתוארת הארכיטקטורה של Car Messenger. מידע נוסף זמין במאמר הבא: שילוב עם CarVoiceInteractionSession.

ארכיטקטורה מבוססת-טלפוניה

כשההתאמה מתבצעת באמצעות Bluetooth, הנתונים מסונכרנים מהטלפוניה של הטלפון למסד הנתונים של הטלפוניה ברכב. לאחר ניתוק Bluetooth, הנתונים המסונכרנים נמחקים מסד נתונים של מערכות טלפוניה.

היכולת הזו הושקה ב-Android 12. היתרונות העיקריים כוללים:

  • ניתן לאחזר ממסד נתונים כמות גדולה של הודעות למשתמשים.
  • יש תמיכה בהודעות מנסיעות קודמות.
  • נעשה שימוש בארכיטקטורה וב-API דומים לאחסון ולאחזור הודעות SMS ב-Android טלפונים.
  • ביטול המארז במלואו מפלטפורמת Android.

ככה עושים את זה:

זרימת נתונים מבוססת טלפוניה איור 1. זרימת נתונים מבוססת טלפוניה.

זרימה שמאוירת בפורמט טקסט:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Car Messenger retrieves data from telephony database to display on UI.
                  |
                  --> 4. User interactions prompt the voice assistant.
                  |
          <-- 5. Car Messenger receives reply action from the voice assistant.
          |
    <-- 6. SMS is marked as read in car database.
    |
 7. Reply transmitted to recipients, phone database updated with reply and read status.

אלה מה שאנחנו עושים עם הנתונים:

שימוש בחבילת הגלישה של Car Messenger איור 2. טיפול בנתונים של Car Messenger.

זרימה שמאוירת בפורמט טקסט:

 1. Phone connects to car.
    |
    --> 2. SMS data transferred from phone's database to car database.
          |
          --> 3. Phone disconnects from car.
                  |
                  --> 4. SMS data deleted from car telephony database.
  • בזמן החיבור, הנתונים מועברים מהטלפון לרכב באמצעות Bluetooth MAP.
  • עם הניתוק, הנתונים של הטלפון נמחקים ממסד הנתונים של הרכב.

להורדת Car Messenger

מקבלים את העדכון האחרון של Car Messenger מ-Google Git.

ממשקי API של אינטראקציה קולית

Car Messenger משתמש בממשקי API של CarVoiceInteractionSession כדי לשלב אותם עם מ-Assistant. הרכיבים האלה מתוארים בקטעים הבאים.

מודל PendingIntent

ממשקי ה-API האלה משתמשים ב-PendingIntent כדי להעביר שאילתות מ-Assistant שטופלו אל Car Messenger.

זהו רצף האירועים:

  1. Car Messenger מפעיל את Assistant באמצעות התקשרות אל activity.showAssist(Bundle args). הארגומנטים מכילים את פעולת ה-API ואת הפרמטרים הנדרשים שלה, שכוללים Intent בהמתנה במקרה הצורך.

  2. Assistant מאחזרת את הקלט של המשתמשים במקרה הצורך, וחבילות עם Intent בהמתנה.

  3. Assistant שולחת את ה-Intent בחזרה ל-Car Messenger.

  4. Car Messenger פותר את פעולת ה-API.

סימון כפעולת API שנקראה

כש-Assistant מקריאה הודעה, המספר PendingIntent מועבר למכונית Messenger עם הפעולה VOICE_ACTION_READ_NOTIFICATION או VOICE_ACTION_READ_CONVERSATION כדי לסמן את ההודעה כהודעה ש'כבר קראתי'.

פעולת API למענה ישיר

כש-Assistant עונה להודעה, PendingIntent נשלחת למכונית מסנג'ר עם הפעולה VOICE_ACTION_REPLY_NOTIFICATION ו VOICE_ACTION_REPLY_CONVERSATION כדי להשיב לשיחה.

פעולת API ישירה לשליחה של SMS

חבילה עם הפעולה VOICE_ACTION_SEND_SMS נשלחת מ-Car Messenger אל מ-Assistant.

קוד לדוגמה:

/**
 *   KEY_PHONE_NUMBER - Recipient’s phone number. If this and the recipients name are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_NAME - Recipient’s name. If this and the recipient phone number are not
 *   provided by the application, assistant must do contact disambiguation but is not required
 *   to add the name to the PendingIntent.
 *
 *   KEY_RECIPIENT_UID - Recipient’s UID in the ContactProvider database. Optionally provided
 *   by the application. Not required to be sent back by the assistant.
 *
 *   KEY_DEVICE_NAME - Friendly name of the device in which to send the message from. If not
 *   provided by the application, assistant must do device disambiguation but is not required
 *   to add it to PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_DEVICE_ADDRESS - Bluetooth device address of the device in which to send the message
 *   from. If not provided by the application, assistant must do device disambiguation and add
 *   this to the PendingIntent. In V1 this is required to be sent by the application.
 *
 *   KEY_SEND_PENDING_INTENT - @NotNull Will always be provided by the application. The
 *   application must preload the pending intent with any KEYs it provides the assistant that
 *   is also needed to send the message. (I.e if the application passes in the
 *   KEY_PHONE_NUMBER in the Bundle, the assistant can assume the application has already put
 *   this in the PendingIntent and may not re-add it to the PendingIntent).
 *
 */
public static final String KEY_PHONE_NUMBER = “KEY_PHONE_NUMBER”;
public static final String KEY_RECIPIENT_NAME = “KEY_RECIPIENT_NAME”;
public static final String KEY_RECIPIENT_UID = “KEY_RECIPIENT_UID”;
public static final String KEY_DEVICE_NAME = “KEY_DEVICE_NAME”;
public static final String KEY_DEVICE_ADDRESS = “KEY_DEVICE_NAME”;
public static final String KEY_SEND_PENDING_INTENT =”KEY_SEND_PENDING_INTENT”;

בתמונה הזו מוצגת כתיבת הודעה כשבוחרים נמען:

הדף &#39;אנשי קשר&#39; באפליקציית החייגן איור 3. הדף 'אנשי קשר' באפליקציית החייגן.

בתמונה הזו מוצגת כתיבת הודעה כשלא נבחר נמען באמצעות הודעה חדשה:

לא נבחר נמען איור 4. לחצן 'הודעה חדשה' באפליקציית Messenger.

שילוב פעולת שליחה ישירה של SMS

הנה דוגמה לשילוב החייגן VOICE_ACTION_SEND_SMS, שמספק יתרונות :

    /**
     * Build the {@link Bundle} to pass to assistant to send a sms.
     */
    public Bundle buildDirectSendBundle(String number, String name, String uid,
                                        BluetoothDevice device) {
        Bundle bundle = new Bundle();
        bundle.putString(CarVoiceInteractionSession.KEY_ACTION, VOICE_ACTION_SEND_SMS);
        // start optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_PHONE_NUMBER, number);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_NAME, name);
        bundle.putString(CarVoiceInteractionSession.KEY_RECIPIENT_UID, uid);
        // end optional parameters
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_ADDRESS, device.getAddress());
        bundle.putString(CarVoiceInteractionSession.KEY_DEVICE_NAME,
                DialerUtils.getDeviceName(mContext, device));
        Intent intent = new Intent(mContext, MessagingService.class)
                .setAction(ACTION_DIRECT_SEND)
                .setClass(mContext, MessagingService.class);

        int requestCode = ACTION_DIRECT_SEND.hashCode();
        PendingIntent pendingIntent = PendingIntent.getForegroundService(
                mContext, requestCode, intent,
                PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);

        bundle.putParcelable(KEY_SEND_PENDING_INTENT, pendingIntent);
        return bundle;
    }

שיפורים ל'דברים שאפשר לעשות' (TTDR) ולתשובה ישירה

ה-API המעודכן משתמש עכשיו במחלקה Conversation רב-תכליתית, מתן אפשרות לפעולות מעבר לתחום ההתראות והרחבת יכולות בהקשר של האפליקציה. זה מחליף את הדרישה הקודמת לשימוש כיתה אחת (StatusBarNotification).

ניפוי באגים ברכב

כדי לקבל מידע נוסף על ניפוי באגים ב-Car Messenger, אפשר לעיין בקטעים הבאים.

ניפוי באגים בחיבורי Bluetooth

  1. מריצים את הפקודה dumpsys:

    adb shell dumpsys bluetooth_manager
    
    • מחפשים את MapClientService בפלט של פקודת dumpsys.
     Profile: MapClientService
          mCurrentDevice: 99:99 (Pixel XL) name=Mce state=Connected
    
  2. מוודאים שהמכשיר הנכון מופיע. לדוגמה:

    רשימת מכשירים איור 5. רשימת מכשירים.

  3. אם לא נמצא מכשיר, מבצעים את הפעולות הבאות:

    • צריך להתחבר מחדש ל-Bluetooth.

    או

    • בהגדרות Bluetooth,מוודאים שהאפשרות הודעת טקסט מופעלת.

    או

    • בטלפון, מוודאים שהענקתם גישה להודעות.

ניפוי באגים במסדי נתונים של Bluetooth

Car Messenger מבוססת על מסד הנתונים של הטלפוניה. כדי לקבוע אם Bluetooth מופעל לאכלס את מסד הנתונים הזה, תוכלו להשתמש בפקודות שבטבלה.

משימה הוראה
שיחה adb shell content query--uri content://mms-sms/conversations?simple=true
הודעות SMS בלבד adb shell content query--uri content://sms
הודעות MMS/SMS adb shell content query--uri content://mms-sms/conversations
הודעות MMS בלבד adb shell content query--uri content://mms
תיבת דואר נכנס של MMS בלבד adb shell content query--uri content://mms/conversations/inbox
הודעות שנשלחו רק ב-SMS adb shell content query--uri content://sms/sent
תיבת דואר נכנס של SMS בלבד adb shell content query--uri content://sms/conversations/inbox
הודעת MMS חלק 1
(צריך להחליף את 1 במזהה ה-MMS)
adb shell content query--uri content://mms/part/1

שאילתות לגבי ניפוי באגים ב-Car Messenger וב-Voice Assistant

יומנים מודפסים כברירת מחדל אם תמונת ה-build היא eng או userdebug. אחרת, כדי להפעיל את הרישום ביומן עבור Car Messenger:

  1. מריצים את התגים הרלוונטיים adb shell setprop log.tag.<TAG> DEBUG.

  2. הפעלת הרישום ביומן בשביל Assistant שנטענו מראש.

  3. במקרה של באגים שחוזרים על עצמם, מומלץ להשתמש בנקודות עצירה (breakpoint) ב-Android Studio.