Car Messenger

אפליקציית 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.

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

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

מודל PendingIntent

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

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

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

  2. ‫Assistant מאחזר את קלט המשתמש אם צריך, ומצרף אותו ל-pending intent.

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

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

פעולת ה-API 'סימון שקראת'

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

פעולה של Direct Reply API

כש-Assistant משיבה להודעה, PendingIntent נשלחת ל-Car Messenger עם הפעולה VOICE_ACTION_REPLY_NOTIFICATION ו-VOICE_ACTION_REPLY_CONVERSATION כדי להשיב לשיחה.

פעולה של Direct Send SMS API

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

קוד לדוגמה:

/**
 *   KEY_PHONE_NUMBER - Recipients 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 - Recipients 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 - Recipients 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, עם פרמטרים אופציונליים:

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

שיפורים ב-TTR ובתשובה ישירה

ה-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
חלק 1 של הודעת MMS
(מחליפים את 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. מפעילים את הרישום ביומן עבור Preloaded Assistant.

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