שליח לרכב

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

מה חדש ב-Car Messenger?

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

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

טרמינולוגיה

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

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

תשובה ישירה
התכונה דומה ל'הקשה כדי לקרוא', אלא שהעוזרת הקולית לא קוראת את ההודעה ומציגה מיד הנחיה להשיב לה.

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

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

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

  • שימוש בשיטות ציבוריות בלבד (אין יחסי תלות של פלטפורמה בממשקי 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.

כך אנחנו משתמשים בנתונים:

השימוש בחבילת הגלישה ב-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. הרכיבים האלה מתוארים בקטעים הבאים.

מודל PendingIntent

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

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

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

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

  3. Assistant שולחת את הכוונה חזרה אל Car Messenger.

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

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

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

פעולת API של תשובה ישירה

כש-Assistant משיבה להודעה, PendingIntent נשלח ל-Car Messenger עם הפעולה 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”;

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

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

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

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

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

דוגמה לשילוב של VOICE_ACTION_SEND_SMS ב-Dialer, עם פרמטרים אופציונליים:

    /**
     * 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;
    }

שיפורים במדד זמן הצגת המודעות ובאפשרות 'תשובה ישירה'

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

ניפוי באגים ב-Car Messenger

בקטעים הבאים מפורט מידע נוסף על ניפוי באגים ב-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 ושל העוזרת הקולית

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

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

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

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